2012-03-10 15 views
41
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:@"xxxxxxxx" forKey:@"name"]; 

[defaults synchronize]; 

Muszę wiedzieć, dlaczego muszę używać ostatniej linii powyższego kodu [defaults synchronize]? Jaki jest cel jego używania? Czy to musi być?NSUserDefaults metoda synchronizacji

+7

Nie wypróbowałeś instrukcji obsługi, prawda? – JustSid

+21

zabawne, ponieważ znalazłem tę stronę przez Google, szukając tego samego pytania. – likebeats

+0

Krótko mówiąc, nie musisz go używać. Zobacz moją odpowiedź poniżej. – Seryozha

Odpowiedz

90

Celem [default synchronize]; jest ustawienie domyślnych ustawień użytkownika na dysku natychmiast. Nie musisz tego wyraźnie wywoływać, iOS już to robi w odpowiednich momentach. Możesz więc usunąć tę linię. W rzeczywistości jest to problem z wydajnością, jeśli wywołasz synchronize za każdym razem, gdy ustawisz wartość domyślną.

Przed iOS 7 użytkownik domyślnie jest zawsze synchronizowany, gdy aplikacja przechodzi w tło. Od wersji iOS 7 nie ma już miejsca, więc możesz zadzwonić pod numer synchronize w swoim uczestniku applicationDidEnterBackground: lub zarejestrować się w powiadomieniu UIApplicationDidEnterBackgroundNotification, aby to zrobić.

Od the documentation for -[NSUserDefaults synchronize]:

Ponieważ metoda ta jest automatycznie wywoływana w regularnych odstępach czasu, należy użyć tej metody tylko wtedy, gdy nie można czekać do automatycznej synchronizacji (na przykład, jeśli aplikacja ma zamiar wyjść) lub jeśli chcesz aby zaktualizować domyślne ustawienia użytkownika na dysku, nawet jeśli nie wprowadzono żadnych zmian.

+0

Więc mówisz, że będą problemy z wydajnością, jeśli zrobię to za każdym razem? Czy to jest ok, jeśli pominę tę linię, kod i tak działa bez niej. – shajem

+0

Możesz, jeśli nie planujesz używać obiektu 'name' przez jakiś czas. – Emil

+4

Tak, twój kod będzie działał dobrze bez tej linii. Twoje ustawienia zostaną zapisane do flashowania przez iOS automatycznie później. Zostanie on napisany, gdy Twoja aplikacja znajdzie się w tle. Pamiętaj jednak, że podczas debugowania: jeśli zabijesz aplikację, naciskając przycisk "stop" lub gdy aplikacja się zawiesza, możliwe, że ustawienia nie zostały jeszcze zapisane. – DarkDust

1

Nie trzeba napisać ten wiersz już.

Odniesienie metoda ze zaktualizowanymi documentation

czeka na wszelkie oczekujące asynchronicznych aktualizacjach domyślnych bazie i zwroty; ta metoda jest niepotrzebna i nie powinna być używana.

Komentarze do metody wyjaśniającej, co należy zrobić.

 /*! 
    -synchronize is deprecated and will be marked with the NS_DEPRECATED macro in a future release. 

    -synchronize blocks the calling thread until all in-progress set operations have completed. This is no longer necessary. Replacements for previous uses of -synchronize depend on what the intent of calling synchronize was. If you synchronized... 
    - ...before reading in order to fetch updated values: remove the synchronize call 
    - ...after writing in order to notify another program to read: the other program can use KVO to observe the default without needing to notify 
    - ...before exiting in a non-app (command line tool, agent, or daemon) process: call CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication) 
    - ...for any other reason: remove the synchronize call 
     */ 
    open func synchronize() -> Bool