2009-11-16 11 views
7

Jeśli użytkownik jest aktualnie w moim kontroler widoku edycji, chcę mieć możliwość zapisania zmian, gdy użytkownik zamknie moją aplikację. Aby to zrobić, obserwuję numer udostępnionej aplikacji. W delegacie mojej aplikacji używam metody applicationWillTerminate: do zamykania wszystkich elementów i uwalniania wszystkich podstawowych kontekstów danych.Aplikacja zakończy powiadomienie i zapisuje wersję roboczą (dane podstawowe)

Problem mam ze znalezieniem jest to, że metoda w app delegata applicationWillTerminate: pobiera nazywane przed obserwatorzy reagują na zgłoszenia . Oznacza to, że mój podstawowy stos danych został zwolniony i zamknięty, zanim mój kontroler widoku edycji ma szansę na zapisanie czegokolwiek!

Jak to zwykle przezwycięża się, ponieważ nie widzę sposobu!

Dziękujemy,

Michael

Odpowiedz

4

Edit:Pierwsze podejście (notification-based) prawdopodobnie nie będzie działać ze względu na wewnętrzne funkcjonowanie pętli biegać i powiadomień.

Jeśli chcesz pozostać przy architekturze opartej na powiadomieniach, możesz wysłać własne powiadomienia z poziomu applicationWillTerminate:. Po prostu stwórz własne powiadomienie MyApplicationWillTerminate, a następnie zadzwoń pod postNotification: na [NSNotificationCenter defaultCenter]. Następnie zarejestruj kontroler edycji dla instancji o wartości MyApplicationWillTerminate zamiast domyślnej .

Innym wyborem jest, aby twój magazyn delegowania aplikacji był egzemplarzem kontrolera edycji, jeśli jest widoczny, a następnie applicationWillTerminate: zapisz nowe informacje przed zwolnieniem kontekstu danych podstawowych. To zanieczyszcza delegata aplikacji dodatkowymi zmiennymi instancji, więc może nie być optymalnym rozwiązaniem.

Ostatnia myśl: dlaczego aplikacja nie może zapisać zmian wprowadzanych przez użytkownika? W ten sposób nie musisz martwić się o to, że aplikacja zamyka się w połowie edycji informacji - edycje są już zapisane i możesz po prostu wydać zawartość Core Data tak jak już jesteś. (To może nie być odpowiednie dla ciebie, naprawdę nie mogłem powiedzieć, nie wiedząc więcej o strukturze aplikacji i jakie dane edytujesz.)

+1

+1 za zapisywanie wersji roboczych, gdy użytkownik wprowadza zmiany; czas na cokolwiek użytecznego lub skomplikowanego w trakcie wypowiedzenia jest dość ograniczony. –

+0

Interesujący punkt dotyczący zapisywania zmian w momencie ich wystąpienia. Mogę się nad tym zastanowić. Kiedy wspominasz o zamieszczaniu moich własnych powiadomień, czy nie zostaną one odebrane w następnej pętli uruchamiania i po zakończeniu kodu 'applicationWillTerminate:'? Ponieważ cały kod będzie na tym samym (głównym) wątku. –

+0

Michael: prawdopodobnie masz rację - zdałem sobie z tego sprawę zaraz po opublikowaniu mojej odpowiedzi (teraz edytowanej). Najprawdopodobniej najlepiej jest zapisywać zmiany w momencie ich wystąpienia i tym samym całkowicie obejść ten problem. – Tim

0

Nie jesteś pewien, ale czy NSManagedObjectContext zachowuje koordynator sklepu i model obiektu? W takim przypadku, czy nie wystarczy, aby kontroler zachował kontekst obiektu zarządzanego?

Powiązane problemy