2009-11-07 3 views
6

Что я пытаюсь сделать?Есть ли способ совместного использования хранилища основных данных между процессами?

  1. Способ пользовательского интерфейса, который считывает данные из хранилища основных данных на диске. Нет необходимости редактировать данные, просто читать и отображать данные.

  2. Процесс командной строки, который записывает в тот же хранилище данных, что и пользовательский интерфейс.

Почему?

Чтобы процесс командной строки мог работать все время, но пользователь может выйти из процесса пользовательского интерфейса и забыть о приложении, пока ему не понадобится просматривать данные, которые он захватил.

Что было бы самым простым и надежным способом достижения этого?

Что я пробовал?

Я читал об обмене хранилищем данных между потоками и реализовал это раньше, но я не могу найти что-либо в документах или в Интернете, указав, как делиться хранилищем между процессами.

Как это просто указать на оба процесса в одном файле хранилища данных? Я коротко экспериментировал с этим. Кажется, он работает нормально, но я волнуюсь, что у меня могут возникнуть проблемы с блокировкой и т. Д., Когда он действительно подвергается стрессу.

Наконец

Я бы очень признателен кто-то дает мне указатели на каком направлении идти с этим. Благодарю.

ответ

2

Это может быть одна из тех ситуаций, в которых вам просто нужно попробовать это и увидеть.

Насколько я помню, SQLite (который является хранилищем данных, которое вы, скорее всего, захотите использовать) имеет встроенные механизмы блокировки файлов и т. Д .; поэтому целостность файла, скорее всего, будет гарантирована. Если, с другой стороны, вы используете подход CoreData/XML, вы можете столкнуться с проблемами.

Иными словами; используйте поддержку SQLite для вашего файла, и вы, вероятно, будете в порядке.

1

Вам нужно переосмыслить свою архитектуру. Если вы хотите, чтобы демона владела хранилищем данных, подключите ваше приложение графического интерфейса к демону. Попытка поделиться хранилищем данных - это банку червей, которую вы не хотите открывать.

+0

Это не обязательно так. Основанный на SQLite постоянный хранилище Core Data будет работать нормально, если не существует bazillion операций записи/секунда от демона. – bbum

+0

И так как у меня буквально 12 сейвов каждые 3 секунды, я думаю, что это меньше, чем «базильон»! :) –

2

Вы можете сделать именно то, что хотите, вы, вероятно, захотите использовать хранилище SQLite, иначе сохранение и фиксация каждый раз, когда вы хотите синхронизировать данные, будет ужасно медленным. Вам просто нужно использовать какой-то дверной звонок IPC между приложениями, чтобы вы могли сообщить одному приложению, что ему нужно перепроверить постоянное хранилище на диске и объединить его данные.

Документы Apple, использующие несколько постоянных запоминающих устройств в качестве действительного варианта в Multi-Threading with Core Data (в «Общие рекомендации», откройте 2). Это происходит, когда обсуждаются полностью параллельные стеки CD в одном и том же процессе, но они действительны, если они также находятся в совершенно разных адресных пространствах.

+0

Спасибо. Это действительно полезно. Я предполагаю передать данные между процессами, которые я бы использовал NSDistributedNotificationCenter или Distributed Objects. Я склоняюсь к последней. http://stackoverflow.com/questions/504122/best-practices-for-passing-data-between-processes-in-cocoa –

+0

Конечно, но если все проходит через постоянный магазин, вы просто сохраняете: в одном процессе , отправьте уведомление, а в другом приложении обновите стек персистентности. Оформить заказ http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/CoreData/Articles/cdUsingMOs.html#//apple_ref/doc/uid/TP40001803-208900 –

+0

Вы можете использовать либо распространенные уведомления, либо kqueue , или dispatch_source для мониторинга файла хранилища sqlite для модификаций. Просто не опробуйте. – bbum

2

Почти два года спустя, и я только что нашел намного лучший способ сделать это.

Ответ, похоже, связан с службами синхронизации. Я даже не понимал, что это существовало! Там отличный пост об этом по адресу:

http://www.timisted.net/blog/archive/core-data-and-sync-services/

Я не пробовал это с моим приложением, но она, кажется, как отличный способ обмена основного хранилища данных между двумя процессами или приложениями.

Если у меня возникли проблемы с производительностью, я соответствующим образом обновлю ответ, но это похоже на рекомендованный Apple способ сделать это.

+0

SyncServices кажется заброшенным в пользу iCloud. – stevesliva

+0

Этот ответ должен быть обновлен теперь, когда Sync Services в значительной степени устарел от Yosemite. Кроме того, введение расширений приложений делает этот вопрос еще более важным (т. Е. Разделяет хранилище основных данных между основным приложением и расширением). – adib

Смежные вопросы

 Смежные вопросы