2012-02-06 5 views
5

Quando sto impostare le preferenze predefinite per la mia app, sto facendo la seguente:Perché utilizzare registerDefaults: anziché setValue: forKey :?

1) Lettura Root.plist dall'interno Settings.bundle in un dizionario.

2) I test se una preferenza è impostato, e se non sto registrando il mio dizionario di default tramite [NSUserDefaults standardUserDefaults] registerDefaults:]

Il problema è, di default registrati registerDefaults: non vado al negozio persistente, quindi, se l'utente non cambia le loro preferenze Sto leggendo le mie preferenze predefinite e registrandole con NSUserDefaults ogni volta che l'app si avvia.

Invece di usare registerDefaults: ho potuto utilizzare setValue:forKey: e avere la mia impostazione di default andare al negozio persistente, bypassando la necessità di costruire & registrare un dizionario su ogni lancio. Tuttavia, Apple documentation e sample code puntano entrambi a registerDefaults:.

Quindi sto cercando di capire quando e perché dovrei usare registerDefaults: e quando/perché dovrei usare setValue:forKey: invece?

+1

Ho trovato questa domanda correlata: [Qual è l'uso di [NSUserDefaults registerDefaults:]?] (Http://stackoverflow.com/questions/4931167/what-is-the-use-of-nsuserdefaults-registerdefaults) Mentre le risposte spiegano le differenze, non dicono ancora veramente perché dovresti usarne una sull'altra. (Le risposte sembrano ignorare la mia domanda sulla persistenza.) – gabrielk

risposta

5

Il problema è che, di default registrati registerDefaults: non andare al negozio persistente, quindi, se l'utente non cambia mai le loro preferenze Sto leggendo le mie preferenze predefinite e la registrazione con NSUserDefaults ogni volta i lanci app.

Sì. Perchè questo è un problema? Perché scrivere su disco cose che hai già nel codice?

Invece di usare registerDefaults: ho potuto utilizzare setValue: Forkey: e la mia impostazione di default andare al negozio persistente, bypassando la necessità di costruire & registrare un dizionario su ogni lancio. Tuttavia, la documentazione e il codice di esempio di Apple puntano entrambi a registerDefaults :.

Solo se prima si è verificato "è impostato questo valore? No? OK, ora impostato". Questo è più codice e costo rispetto all'utilizzo di registerDefaults:.

È necessario utilizzare registerDefaults: per impostare i valori predefiniti. È necessario utilizzare setValue:forKey: per salvare valori impostati attivamente.

Ricorda anche che NSUserDefaults esiste anche su Mac. Lì, l'utente può accedere direttamente alle impostazioni con il comando defaults, quindi il programma non è l'unica entità che può modificare questo negozio.

+0

Suppongo che non sia un problema, sembra proprio ridondante. Se imposto i valori predefiniti e l'utente non li apprezza, può cambiarli e la modifica viene salvata ... e devo ancora continuare a configurare i valori predefiniti. Allo stesso modo, se un utente è soddisfatto delle impostazioni predefinite e non ha motivo di salvarle ... Devo continuare a configurare i valori predefiniti. Ha più senso per me salvare i valori predefiniti, poiché il valore predefinito memorizzato verrebbe comunque sovrascritto dall'utente.Non riesco ancora a vedere un caso solido per l'utilizzo di registerDefaults: – gabrielk

+0

È particolarmente strano per me perché i valori predefiniti che desidero vengono memorizzati nel file .plist di Settings.bundle, ma non vengono utilizzati come valori predefiniti effettivi (più come un suggerimento per la GUI quando si visualizzano le scelte?). – gabrielk

+1

Oltre al fatto che richiede più codice per memorizzare i valori predefiniti nello store (poiché per prima cosa è necessario verificare se sono già impostati), salvarli nel negozio rende impossibile modificare l'impostazione predefinita per gli aggiornamenti futuri e gli sprechi spazio se si elimina un'impostazione durante un aggiornamento. Ma "è molto più codice per controllare tutti i valori predefiniti e poi impostarli" è davvero la più grande vittoria per gli sviluppatori di "registerDefaults:". –