2009-11-07 12 views
6

Co próbuję zrobić?Czy istnieje sposób udostępniania magazynu danych podstawowych między procesami?

  1. Proces UI, który odczytuje dane z magazynu danych Core na dysku. Nie trzeba edytować danych, wystarczy odczytać i wyświetlić dane.

  2. Proces wiersza polecenia, który zapisuje do tego samego magazynu danych, do którego dostęp uzyskuje interfejs użytkownika.

Dlaczego?

Aby proces wiersza poleceń działał cały czas, ale użytkownik może zamknąć proces interfejsu użytkownika i zapomnieć o aplikacji, dopóki nie będzie musiał spojrzeć na przechwycone dane.

Jaki byłby najprostszy i najbardziej niezawodny sposób na osiągnięcie tego?

Co próbowałem?

Przeczytałem o udostępnianiu magazynu danych między wątkami i zaimplementowałem to wcześniej, ale nie mogę znaleźć niczego w dokumentach ani w sieci, co wskazywałoby sposób udostępniania sklepu między procesami.

Czy tak proste, jak wskazanie obu procesów w tym samym pliku składnicy danych? Eksperymentowałem z tym krótko. Wyglądało na to, że działa dobrze, ale obawiam się, że mogę napotkać problemy z blokowaniem itp., Gdy jest to naprawdę stresujące.

Wreszcie

bym naprawdę docenić kogoś, dając mi wskazówki na jakim kierunku pójść z tym. Dzięki.

Odpowiedz

2

To może być jedna z tych sytuacji, w których po prostu trzeba spróbować i zobaczyć ™.

O ile pamiętam, SQLite (który jest magazynem danych, z którego najprawdopodobniej będziesz chciał korzystać), ma wbudowane mechanizmy blokowania plików i tak dalej; więc integralność pliku może być zapewniona. Jeśli, z drugiej strony, używasz podejścia CoreData/XML, możesz napotkać problemy.

Innymi słowy; używaj podkładu SQLite dla twojego pliku i prawdopodobnie powinno być dobrze.

1

Musisz ponownie przemyśleć swoją architekturę. Jeśli chcesz, aby demon był właścicielem magazynu danych, połącz się z demonem za pomocą aplikacji GUI. Próba udostępnienia magazynu danych to puszka robaków, których nie chcesz otwierać.

+0

To niekoniecznie musi być prawda. Oparty na SQLite, stały magazyn Core Data będzie działał dobrze, o ile nie będzie operacji zapisu/sekundowania przez demona. – bbum

+0

A ponieważ mam dosłownie 12 zapisów co 3 sekundy, myślę, że kwalifikuje się to mniej niż "miliard"! :) –

2

Możesz zrobić dokładnie to, co chcesz, prawdopodobnie chcesz użyć sklepu SQLite, w przeciwnym razie zapisywanie i zatwierdzanie za każdym razem, gdy chcesz zsynchronizować dane będą strasznie powolne. Musisz tylko użyć jakiegoś dzwonka IPC pomiędzy aplikacjami, abyś mógł poinformować jedną aplikację, której potrzebuje, aby ponownie sprawdzić stały magazyn na dysku i scalić jego dane.

Dokumenty Apple z wykorzystaniem wielu trwałych nawrotów sklepów jako ważnej opcji w Multi-Threading with Core Data (w "Ogólnych wytycznych", otwórz 2). Tak się składa, że ​​omawiamy całkowicie równoległe stosy CD w tym samym procesie, ale jest to ważne, jeśli są one również w całkowicie oddzielnych przestrzeniach adresowych.

+0

Dzięki. To naprawdę pomocne. Zakładam, że przesyłam dane między procesami, których używałbym NSDistributedNotificationCenter lub Obiektami rozproszonymi. Pochylam się do tego drugiego. http://stackoverflow.com/questions/504122/best-practices-for-passing-data-between-processes-in-cocoa –

+0

Oczywiście, ale jeśli wszystko przechodzi przez trwały sklep, po prostu zapisz: w jednym procesie , wyślij powiadomienie, a w drugiej aplikacji zaktualizuj stos utrwalania. Zamówienie http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/CoreData/Articles/cdUsingMOs.html#//apple_ref/doc/uid/TP40001803-208900 –

+0

Możesz użyć albo powiadomień rozproszonych, kociaka lub dispatch_source do monitorowania pliku magazynu sqlite w celu modyfikacji. Po prostu nie odpytywaj. – bbum

2

Prawie dwa lata później, i właśnie znalazłem o wiele lepszy sposób robienia tego.

Odpowiedź wydaje się być związana z usługami synchronizacji. Nawet nie zdawałem sobie sprawy, że to istnieje! Jest to doskonałe stanowisko na ten temat pod adresem:

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

ja nie próbowałem tego jeszcze z moim app, ale wydaje się, że to doskonały sposób na dzielenie składnicę danych rdzenia między dwoma procesami lub aplikacjami.

Jeśli wystąpią jakiekolwiek problemy z wydajnością, zaktualizuję tę odpowiedź odpowiednio, ale wydaje się, że jest to zalecany przez Apple sposób wykonania tej czynności.

+0

Wydaje się, że SyncServices został porzucony na rzecz iCloud. – stevesliva

+0

Ta odpowiedź musi zostać zaktualizowana, ponieważ usługi synchronizacji są w zasadzie przestarzałe od czasu Yosemite. Ponadto wprowadzenie rozszerzeń aplikacji czyni tę kwestię jeszcze ważniejszą (tj. Współdzielenie magazynu danych podstawowych między główną aplikacją a rozszerzeniem). – adib

Powiązane problemy