Есть ли способ обмена хранилищем базовых данных между процессами?
Что я пытаюсь сделать?
Процесс пользовательского интерфейса, который читает данные из основного хранилища данных на диске. Не нужно редактировать данные, просто читать и отображать данные.
Процесс командной строки, который записывает данные в то же хранилище данных, к которому обращается пользовательский интерфейс.
Зачем?
Таким образом, процесс командной строки может выполняться все время, но пользователь может выйти из процесса пользовательского интерфейса и забыть о приложении до тех пор, пока ему не понадобится просмотреть захваченные данные.
Каков был бы самый простой и надежный способ достижения этого?
Что я пробовал?
Я прочитал о совместном использовании хранилища данных между потоками и реализовал это однажды, но я не могу найти ничего в документах или в Интернете, указывающих, как разделить хранилище между процессами.
Это так же просто, как указывать оба процесса на один и тот же файл хранилища данных? Я экспериментировал с этим кратко. Казалось, что все работает хорошо, но я боюсь, что у меня могут возникнуть проблемы с блокировкой и т. Д., Когда это действительно вызывает стресс.
в заключение
Я был бы очень признателен, если бы кто-то дал мне указания о том, в каком направлении двигаться дальше Благодарю.
4 ответа
Это может быть одна из тех ситуаций, когда вам просто нужно попробовать и посмотреть ™.
Насколько я помню, в SQLite (хранилище данных, которое вы, скорее всего, захотите использовать) встроены механизмы блокировки файлов и т. Д.; таким образом, целостность файла, вероятно, будет гарантирована. Если, с другой стороны, вы используете подход CoreData/XML, вы можете столкнуться с проблемами.
Другими словами; используйте поддержку SQLite для своего файла, и у вас, вероятно, все будет хорошо.
Вы можете делать именно то, что вы хотите, вы, вероятно, хотите использовать хранилище SQLite, иначе сохранение и фиксация каждый раз, когда вы хотите синхронизировать данные, будут ужасно медленными. Вам просто нужно использовать своего рода дверной звонок IPC между приложениями, чтобы вы могли сообщить одному приложению, в котором оно нуждается, перепроверить постоянное хранилище на диске и объединить его данные.
Apple документирует использование нескольких постоянных кориндоров хранилища в качестве допустимого параметра в многопоточности с базовыми данными (в "Общих правилах", откройте 2). Это происходит при обсуждении полностью параллельных стеков CD в одном и том же процессе, но это справедливо, если они также находятся в совершенно разных адресных пространствах.
Прошло почти два года, и я нашел гораздо лучший способ сделать это.
Ответ, кажется, лежит на Sync Services. Я даже не осознавал, что это существует! Об этом есть отличный пост:
http://www.timisted.net/blog/archive/core-data-and-sync-services/
Я еще не пробовал это с моим приложением, но кажется, что это отличный способ поделиться основным хранилищем данных между двумя процессами или приложениями.
Если у меня возникнут какие-либо проблемы с производительностью, я соответствующим образом обновлю этот ответ, но похоже, что Apple рекомендует этот способ.
Вы должны переосмыслить свою архитектуру. Если вы хотите, чтобы демон владел хранилищем данных, подключите приложение GUI к демону. Попытка поделиться хранилищем данных - это червь, который вы не хотите открывать.