2013-07-11 17 views
6

Nella mia applicazione, voglio memorizzare la data in cui l'app viene avviata per la prima volta.
Sto utilizzando seguente codice nell'applicazione: didFinishLaunchingWithOptions metodo
iOS - Impossibile memorizzare NSDate in NSUserDefaults

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

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

Ma ogni volta quando inizio l'applicazione, la sua stampa del momento in cui l'applicazione sta iniziando. Non stampa la data in cui ho avviato l'app.

Ho provato a reimpostare il simulatore e ho eseguito nuovamente il codice. Ancora nessun successo. Qualcuno può indicarmi l'errore nel mio codice, per favore?

+1

Non dimenticare di [sincronizzazione predefinita]; ? –

+1

Se si imposta la data ogni volta che si avvia l'app, perché si prevede di vedere qualcosa di diverso rispetto alla data corrente? – rmaddy

+0

@rmaddy, Scusa, ho aggiornato il mio codice – Satyam

risposta

14

Dal momento che il vostro obiettivo di è tenere traccia della prima volta che un utente avvia la vostra applicazione, è necessario qualcosa di simile in 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

poiché registerDefaults verrà chiamato solo la prima volta, dal prossimo avvio dell'app, poiché i valori predefiniti sono già impostati, non imposterà nuovamente i valori predefiniti. Si presume che NSUserDefaults memorizzi i dati in modo permanente. Non è vero? – Satyam

+3

No, 'registerDefaults' viene chiamato ogni volta che viene chiamato. 'registerDefaults' NON scrive nulla. Fornisce solo un valore se una chiamata per recuperare un valore restituirà altrimenti 'nil'. In questo caso, usare 'registerDefaults' non ha senso. – rmaddy

+1

grazie mille per i chiarimenti. – Satyam

5

È necessario chiamare [[NSUserDefaults standardDefaults] synchronize] dopo aver impostato il valore.

Dal Apple Docs:

In fase di runtime, si utilizza un oggetto NSUserDefaults di leggere le impostazioni predefinite che l'applicazione utilizza dal database di default di un utente. NSUserDefaults memorizza nella cache le informazioni per evitare di dover aprire il database di default dell'utente ogni volta che è necessario un valore predefinito. Il metodo di sincronizzazione, che viene richiamato automaticamente ad intervalli periodici, mantiene la cache in memoria in sincronia con

database di default di un utente.

+0

Il tuo aggiornamento dimostra il mio punto. Il sistema operativo sincronizzerà automaticamente le impostazioni predefinite dell'utente. – rmaddy

+0

Non ha capito completamente cosa stava chiedendo –

-1

È possibile memorizzare e recuperare in questo modo

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() 
    } 
} 
Problemi correlati