2009-09-30 13 views
12

Pracuję nad aplikacją opartą na danych nie opartą na dokumencie.Automatyczne zapisywanie danych za pomocą kakao i danych podstawowych

Chciałbym, aby zmiany zostały zapisane w momencie ich pojawienia się. Tego właśnie oczekuje użytkownik w tego typu aplikacjach. To właśnie firma Apple zaimplementowała w wersji iPhoto lub iTunes.

Metoda brute force polegałaby na ustawianiu licznika czasu do częstego zapisywania. Metoda wywołana przez zapisywanie połknąłaby wszystkie błędy sprawdzania poprawności, aby nie przeszkadzać użytkownikowi. Dopiero po wyjściu użytkownik zostanie zabrudzony w celu uporządkowania danych, aby mógł je zapisać. IMHO, to podejście śmierdzi.

Tak więc myślę, że musi istnieć sposób, aby w jakiś sposób przechwycić oszczędzanie na coś podobnego do protokołu NSEditor. Za każdym razem, gdy użytkownik (lub kontroler) zakończy edytowanie danych, delegat aplikacji powinien zostać powiadomiony o wyzwalaniu operacji składowania. Chodzi o to, że nie wiem, gdzie szukać.

Myślę, że dla bardziej skomplikowanych operacji, które mogą wymagać pewnych sprawdzeń krzyżowych, przedstawiłbym użytkownikowi nieco interfejsu związanego z dedykowanym NSManagedObjectContext.

+0

Jeśli już wspierać cofnąć, wystarczy zapisać go w każdej chwili pchnąć coś na stosie cofania. –

+0

Nie obsługuję jeszcze operacji Cofnij. Używam tylko tego, co zapewnia CoreData. Ale robisz mocne argumenty za rozszerzoną obsługą cofania. –

Odpowiedz

14

Po zakończeniu każdego zdarzenia w aplikacji AppKit CoreData uruchomi dla Ciebie -ProcessPendingTransactions.

Jednym z efektów ubocznych jest to, że jeśli zarejestrowałeś się w NSManagedObjectContext, aby otrzymywać powiadomienia o zmianach, zostaniesz wezwany na końcu każdego zdarzenia.

Na przykład w twojej procedurze obsługi powiadomień możesz zadzwonić po prostu powiedzieć kontekstowi, aby zapisać.

Jednak możesz mieć paranoję na temat zapisywania kontekstu podczas połączenia zwrotnego z tego samego kontekstu, więc prawdopodobnie poczujesz się lepiej, jeśli wykonasz performSelector: @selector (zapisz :) afterDelay: aby popchnąć zapisz, aż zakończy się proces -ProcessPendingTransactions.

Można nawet anulować poprzednio w parametrze -save: selektor i mieć opóźnienie podobne do 5 sekund, więc jeśli użytkownik lub aplikacja znajduje się w środku BUNCH zmian, wszystkie one zostaną połączone w jeden zapis .

I tak właśnie działało Delicious Library 1.0-1.09.

-Wil

+0

Dzięki za cynk. Zarówno twoja sugestia, jak i pomysł wprowadzenia do menadżera cofania wydają się znakomite. Oczywiście, twój komentarz nasuwa pytanie: dlaczego nowsze wersje Delicious Library nie używają tej techniki? –

+0

Postanowiłem spróbować zapisać natychmiast, zamiast po opóźnieniu, ponieważ pracuję w wielu wątkach naraz i kiedy, na przykład, tworzysz okładkę w głównym wątku, NAPRAWDĘ chcesz, aby w tle graficzne wątki managedObjectContexts zobaczyły okładkę natychmiast, nie w ciągu trzech sekund po autozapisaniu. –

+0

Więc Wil wciąż dzwonisz do performSelector: @selector (zapisz :) poDelay: w ogóle czy używasz innej metody autozapisu kontekstu? –

Powiązane problemy