У меня есть некоторые архитектурные сомнения относительно проекта (приложение для Mac OS X), над которым я работаю. В основном он состоит из двух элементов: демона, который работает в фоновом режиме и собирает некоторые данные, и средства просмотра, используемого для представления собранных данных.
Демон должен быть виден в строке состояния (без значка в доке) и включать небольшое меню, доступное через строку состояния. Он сохраняет данные в основном хранилище данных. Одним из пунктов меню является ссылка, которая открывает средство просмотра. При открытии этого средства просмотра должно запуститься обычное приложение с графическим интерфейсом, включая значок в доке и строку меню. Вьювер также открывается при открытии самого приложения (двойным кликом по иконке).
После некоторых экспериментов я понял, что лучший способ добиться этой функциональности — создать два приложения: основное приложение, представляющее программу просмотра, и вспомогательную утилиту, представляющую демон. Одна из причин, по которой я сделал это таким образом, заключается в том, что невозможно мгновенно переключаться между значениями LSUIElement
, чтобы вызвать состояние демона/просмотрщика.
Теперь у меня есть несколько вопросов об этой архитектуре:
И демон, и приложение просмотра используют одно и то же основное хранилище данных для сохранения и извлечения данных. Я знаю, что при наличии многопоточного приложения для правильной синхронизации данных необходимо несколько объектов
NSManagedObjectContext
. Как насчет того, чтобы несколько приложений одновременно использовали одно и то же основное хранилище данных? Возможно ли это вообще без риска конфликтов, блокировок и т. д.? Как я могу гарантировать согласованность?Демон всегда должен запускаться при запуске средства просмотра. Я достиг этого, просто перебирая все открытые процессы и проверяя, указан ли в списке идентификатор пакета демона. Если нет, демон запускается с помощью
launchApplication
NSWorkspace
. Это прекрасно работает. Теперь, когда пользователь выходит из демона, программа просмотра также должна останавливаться. Каков наилучший способ уведомления зрителя об остановке демона? Я могу периодически проверять активные процессы и выходить из средства просмотра, если демон исчез, но это звучит немного странно. Я бы предпочел выбрать какое-то уведомление, которое я отправлю, когда вьювер вот-вот закроется. Но поскольку это уведомление должно быть отправлено и перехвачено между приложениями, я не знаю, какая простая служба уведомлений доступна. Есть предположения?Приложение изолировано, так как оно будет распространяться в Mac App Store. Запуск приложений с
launchApplication
NSWorkspace
приводит к тому, что целевое приложение работает в той же изолированной среде, что и источник, что, я думаю, не является проблемой, потому что запуск обоих приложений в одной и той же песочнице кажется лучше и, вероятно, так и есть. Но представьте такой сценарий: демон запускается автоматически при входе в систему (используяSMLoginItemSetEnabled
), и пользователь дважды щелкает Viewer.app. Поскольку демон уже запущен (опять же, это проверяется путем перебора активных процессов), он не будет запущен. Теперь у нас есть демон и средство просмотра, работающие в разных песочницах, верно? Не вызовет ли это каких-либо проблем с настройками, хранилищем основных данных и т. д.?Я хотел бы использовать
NSUserDefaults
для базовой конфигурации, могу ли я как-то обмениваться этими данными между демоном и вьювером? Опять же, оба приложения будут иметь разные идентификаторы пакетов.
Заранее спасибо за помощь, ценю!
TransformProcessType()
. - person s4y   schedule 19.05.2016