Я реализую метод облачной синхронизации в приложении «обувной коробки» под Mac OS X Lion, и я (как и ожидалось) быстро сталкиваюсь с проблемами потоков / синхронизации.
В приложении есть несколько компонентов, но я чувствую себя немного ошеломленным, пытаясь предотвратить взаимные блокировки, в то же время поддерживая хорошее разделение между частями.
Например, мое приложениеимеет несколько критических поведений:
- Периодически сохраняет на диск и при изменении модели. (Для поддержки автоматического / внезапного завершения в OS X Lion.)
- Периодически уведомляется, когда на диске доступна новая сериализованная модель.
- Обновляет пользовательский интерфейс, когда модельна диск загружается в память или когда сообщается о любых изменениях модели, которые не были вызваны действиями пользователя.
Вот пример использования, который вызывает временную травму мозга:
- Пользователь просматривает список элементов модели в приложении.
- Одновременно приложение уведомляется о новой модели на диске.Приложение загружает модель в память, сохраняя ее во временную переменную.
- Как приложение может заменить старую иерархическую модель данных на новую, не повреждая поток пользовательского интерфейса?Например, есть основной объект RootElement , содержащий множество элементов ChildElement .Если поток пользовательского интерфейса выполняет итерации по myRootElement.children , как можно заменить объект myRootElement без вмешательства?(Например, изменяя список при перечислении.)
Больше, чем конкретное решение, я ищу любые предыдущие ресурсы / методы / парадигмы, чтобы помочь разработать приложение для такого параллелизма и потокабезопасность.