2013-07-11 9 views
6

W mojej aplikacji chcę zapisać datę pierwszego uruchomienia aplikacji.
Używam następujący kod w aplikacji: metodą
iOS - Nie można zapisać NSDate w NSUserDefaults

NSDate* today = [NSDate date]; 
[[NSUserDefaults standardUserDefaults] registerDefaults: @{@"CONSCIENCE_START_DATE" : today}]; 

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"CONSCIENCE_START_DATE"]); 

ale za każdym razem kiedy didFinishLaunchingWithOptions uruchomić aplikację, jej wydrukowaniem czas, w którym aplikacja jest uruchamiana. To nie jest drukowanie daty, kiedy uruchomiłem aplikację.

Próbowałem zresetować symulator i ponownie uruchomić kod. Wciąż nie ma sukcesu. Czy ktoś może mi wskazać błąd w moim kodzie?

+1

Nie zapomnij o [domyślnym ustawieniu synchronizacji]; ? –

+1

Jeśli ustawisz datę przy każdym uruchomieniu aplikacji, dlaczego spodziewasz się zobaczyć coś innego niż aktualna data? – rmaddy

+0

@rmaddy, Przepraszam, zaktualizowałem swój kod – Satyam

Odpowiedz

14

Ponieważ celem jest śledzić po raz pierwszy użytkownik uruchamia aplikację, trzeba coś takiego w application:didFinishLaunchingWithOptions:

NSDate *date = [[NSUserDefaults standardUserDefaults] objectForKey:@"CONSCIENCE_START_DATE"]; 
if (!date) { 
    // This is the 1st run of the app 
    date = [NSDate date]; 
    [[NSUserDefaults standardUserDefaults] setObject:date forKey:@"CONSCIENCE_START_DATE"]; // Save date 
} 

NSLog(@"First run was %@", date); 
+0

, ponieważ registerDefaults będzie się nazywał po raz pierwszy, od następnego uruchomienia aplikacji, ponieważ ustawienia domyślne są już ustawione, to nie ustawi ponownie wartości domyślnych. Od NSUserDefaults oczekuje się trwałego przechowywania danych. Czyż nie? – Satyam

+3

Nie, 'registerDefaults' jest wywoływane za każdym razem, gdy je wywołujesz. 'registerDefaults' nic nie pisze. Dostarcza tylko wartości, jeśli wywołanie w celu odzyskania wartości zwróciłooby 'nil'. W tym przypadku użycie 'registerDefaults' nie ma sensu. – rmaddy

+1

wielkie dzięki za wyjaśnienia. – Satyam

5

Po ustawieniu wartości należy wywołać [[NSUserDefaults standardDefaults] synchronize].

Z Apple Docs:

W czasie wykonywania należy użyć obiektu NSUserDefaults czytać domyślnych że aplikacja korzysta z bazy wartości domyślne użytkownika. NSUserDefaults buforuje informacje, aby uniknąć konieczności otwierania domyślnej bazy danych użytkownika za każdym razem, gdy potrzebujesz wartości domyślnej. Metoda synchronizacja, który jest wywoływany automatycznie w regularnych odstępach czasu, przechowuje w pamięci podręcznej w synchronizacji z

bazy domyślne użytkownika .

+0

Twoja aktualizacja dowodzi mojej racji. System operacyjny automatycznie zsynchronizuje ustawienia domyślne użytkownika. – rmaddy

+0

Nie w pełni rozumiem, o co prosił –

-1

można przechowywać i pobrać w ten sposób

var startDate: NSDate? {

get { 
     return NSUserDefaults.standardUserDefaults().objectForKey(BCGConstants.UserDefaultsKey.startDateKey) as? NSDate 
    } 

    set { 
     NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: BCGConstants.UserDefaultsKey.startDateKey) 
     NSUserDefaults.standardUserDefaults().synchronize() 
    } 
}