2012-01-10 19 views
23

Sono nuovo allo sviluppo di iOS e allo sviluppo di app per dispositivi mobili in generale, ho una buona conoscenza dei pattern Objective C e MVC da utilizzare e non ho mai fatto nessuno sviluppo per Mac.Perché viene utilizzato NSUserDefaults in iOS?

Non riesco a capire a cosa serve NSUserDefaults?

Abbiamo già qualcosa come PList che memorizza i dati come XML e abbiamo SQLite che è DB leggero per tali dispositivi.

Allora perché ce l'abbiamo?

Si tratta di un semplice storage a valore-chiave per la nostra app nello stesso modo in cui abbiamo diversi tipi di storage sul cloud come un RDBMS e un negozio NoSQL basato su valori chiave ecc.?

Per NSUserDefaults, documenti di Apple dicono che: -

"Applicazioni record di tali preferenze assegnando valori di un insieme di parametri nel database di default di un utente"

Che cosa si intende per database predefinito dell'utente ?

La mia ipotesi è che, come in qualsiasi sistema operativo multi-utente, abbiamo vari account utente e allo stesso modo in Mac potremmo avere più utenti con un database da cui le applicazioni caricheranno le preferenze salvate per quello utente.

Quindi, come per Mac OS X, anche iOS ha più utenti e, a seconda di quale sia il login, NSUserDefaults seleziona le sue preferenze?

Per favore dimmi se ho torto.

+0

Controlla questo: http://jayprakashdubey.blogspot.in/2014/07/nsuserdefault-usage.html –

risposta

13

NSUserDefaults vengono utilizzati per salvare piccole porzioni di dati su cui l'app dipende per funzionare correttamente, mentre altri approcci sono utili per archiviare grandi quantità di dati, con cui l'app lavora.

NSUserDefaults rende è incredibilmente facile, come non devi preoccuparti di file, entità, recuperi, .... È tutto fatto in un'unica riga.

+1

Memorizzo qualche valore in NSUserDefaults per usarlo su Rilancio dell'app. ma ottengo il valore nullo qualche volta dopo molto tempo di rilanciare l'app. – freelancer

+0

Questa è una domanda? scriverne uno nuovo con tutto il codice rilevante, dato che NSUserDefaults dovrebbe memorizzare le informazioni in modo permanente. – vikingosegundo

1

NSUserDefaults valori memorizzati solo per l'applicazione.

Nota: non è destinato a sostituire un archivio tradizionale per i dati (dati di base, SQLite, elenchi di proprietà, ecc. Sono destinati alla memorizzazione dei dati dell'applicazione). Quello che è inteso per NSUserDefaults è per specifiche coppie di valori chiave.

Ad esempio, lo uso per memorizzare il nome utente e il nome completo di un utente autenticato al termine del processo di accesso. Dopo il timeout o il logout della sessione, azzeramento di tali valori. Per questo NSUserDefaults brilla.

+0

Quindi il tipo di archiviazione temporanea di NSUserDefaults per una sessione di applicazioni? come l'archiviazione di sessioni in un'applicazione web? –

+0

No. NSUserDefaults è per la memorizzazione permanente. L'opposto totale del temporaneo. Se vuoi che i tuoi dati siano presenti in qualsiasi momento e se sono abbastanza piccoli, vai avanti e salvalo in NSUserDefaults. Supponiamo che tu stia sviluppando un gioco e che la tua app sia costituita da una visualizzazione delle impostazioni che consente all'utente di scegliere opzioni come "Nick Name", colore, velocità ecc., Quindi è necessario utilizzare NSUserDefaults per salvare tali preferenze utente. Puoi anche usare plist e sql-lite ma la best practice suggerita dalla maggior parte degli sviluppatori iOS è quella di usare NSUserDefaults per le impostazioni dell'app. –

4

Originariamente è per la memorizzazione delle impostazioni, ma sembra essere usato (ab) per molte altre cose se le domande su SO sono qualcosa da fare. Il "punto" è che fornisce un metodo di persistenza e recupero dei dati a linea singola per una vasta gamma di tipi di dati.

ci

è alcuna configurazione multi-utente (ancora?) su iOS (avete mai dovuto accedere al tuo iPhone?) Che è costruito a NSUserDefaults, ma perché OS X e iOS sono costruite sulla stessa fondazione, la stessa classe viene utilizzata per entrambi i sistemi operativi.

+0

Quindi il ruolo NSUserDefaults in MacOsX era quello di memorizzare le impostazioni come valore-chiave nel database predefinito dell'utente da cui le applicazioni possono prelevare i dati. Ma dimmi, in iOS è solo una semplice memorizzazione di valori chiave perché c'è un solo utente quindi il nome NS "Utente" Default non ha alcun significato qui? Senza dubbio .. è in uso (ab): P Quindi, qual è esattamente il suo caso d'uso in iOS? Mi dispiace per essere un po 'sciocco, ma non possiedo un iphone. Ho fatto un sacco di web dev nel mio laurea e devo lavorare su iOS nella mia azienda. –

+0

Questo dovrebbe essere stato selezionato come risposta corretta. La domanda originale: "Così come per Mac OS X, anche iOS ha più utenti e, in base a qualsiasi accesso, NSUserDefaults sceglie le sue preferenze?" non è stato risolto dall'altra risposta. – user523234

3

iOS è un sistema operativo a utente singolo. Quindi, NSUserDefaults viene utilizzato in modo diverso in OSX e iOS.

In iOS, si utilizzano normalmente NSUserDefaults per salvare le preferenze dell'applicazione e/oi dati utente sul "sistema di default di iOS". I dati salvati nel sistema di default saranno permanenti in qualsiasi momento anche quando si riavvia il dispositivo iOS. È un dato di fatto, anche quando l'utente aggiorna l'applicazione.

In genere si desidera utilizzare NSUserDefaults per salvare le preferenze/le impostazioni dell'applicazione. Qualsiasi altro enorme dato come dati di gioco o calcoli in tempo reale dovrebbe essere salvato in CoreData o sqllite nella directory dei documenti.

+0

In caso di aggiornamento delle impostazioni utente, i valori predefiniti vengono scaricati. –

+0

@AnkitJain Un altro thread suggerisce che non è vero, al di fuori di glitches: http://stackoverflow.com/questions/1638766/do-nsuserdefaults-persist-through-an-update-to-an-app-in-the-appstore –

14

Una cosa che non è stata ancora menzionata: NSUserDefaults supporta tutti i tipi scalari di base (float, int, BOOL), nonché i tipi compatibili plist: NSData, NSString, NSNumber, NSDate, NSArray e NSDictionary. (Hai citato i plists come alternativa - NSUserDefaults è solo un front-end di un file plist standard nella cartella delle preferenze dell'applicazione.) Ciò semplifica la creazione di archivi persistenti per lo stato dell'applicazione in poche righe di codice. Ancora meglio, se si implementa NSCoding sui vostri oggetti del modello, è possibile archiviarli in un NSData e metterli in NSUserDefaults:

NSData* data = [NSKeyedArchiver archivedDataWithRootObject:arrayOfModelObjects]; 

[[NSUserDefaults standardUserDefaults] setObject:data forKey:kDefaultsKeyModelObjects]; 

e ripristino dei dati applicazione è semplice come

- (void)viewDidLoad 
{ 
    NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:kDefaultsKeyModelObjects]; 

    arrayOfModelObjects = [[NSKeyedUnarchiver unarchiveRootObject:data] retain]; 

    // error checking, tell UI to load the new values, etc... 
} 

(kDefaultsKeyModelObjects è una costante di stringa che hai definito da qualche parte.Tieni sempre le tue chiavi NSUserDefaults in un unico posto! Avere un errore in un nome chiave può richiedere ore per eseguire il debug. :)

Se hai utilizzato, ad esempio, SQLite per memorizzare i dati dell'applicazione , devi scrivere molto codice per mov e i dati del tuo modello dentro e fuori dal database. Questo ha senso se hai a che fare con molti dati, hai bisogno di ricerche efficienti, ecc .; ma se si tratta, per esempio, di un elenco di server in un'app di rete, è più facile e più pulito inserirli in NSUserDefaults.

Un'ultima cosa: NSUserDefaults è ottimo per la prototipazione. Anche se sai che alla fine avrai bisogno di un archivio SQLite, puoi iniziare a utilizzare NSUserDefaults come un archivio persistente facile e veloce, e far funzionare la tua interfaccia utente e il tuo modello di dati prima di scrivere una serie di codice di database.

Così come Mac OS X, si fa iOS dispongono anche di più utenti e in base alla a seconda di quale è registrato NSUserDefaults mette le dita/sue preferenze?

No, su iOS le impostazioni predefinite plist è nella cartella Library/Preferences dell'applicazione, non in una cartella specifica per l'utente come è su OS X. Non riesco a immaginare iOS avrà mai più login, ma si mai saputo. Se lo facesse, avrebbero dovuto creare elenchi di valori predefiniti separati per utenti diversi.

Problemi correlati