Come funzionare correttamente (recuperare i valori) con NSUserDefaults
-
03-07-2019 - |
Domanda
Ho un metodo semplice nel mio codice che assomiglia al seguente:
- (BOOL)isFirstTimeLogin
{
NSString *t_gName =
[NSString stringWithFormat:@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:kGroupIdentifierKey]];
if ([t_gName isEqualToString:@""] || t_gName == nil) {
DLog(@"LoginViewController, m:::isFirstTimeLogin, First time login happening.");
return YES;
}
DLog(@"LoginViewController, m:::isFirstTimeLogin, Not a first time login.");
return NO;
}
Semplicemente ciò che fa è andare al bundle Impostazioni e recuperare un valore da un PSTextFieldSpecifier. Se entro manualmente e aggiungo del testo arbitrario, il codice funziona come previsto. Tuttavia, ogni volta che installo l'app per la prima volta su un nuovo dispositivo, la prima condizione viene eseguita come falsa, il che dovrebbe essere vero. Dopo aver controllato il codice, gdb dimostra che anche l'oggetto è davvero nullo:
(gdb) po t_gName
(Null)
Cosa posso fare di sbagliato qui? Perché la condizione non riesce per la prima volta che l'app viene installata e t_gName è un PSTextFieldSpecifier vuoto / null. Ho persino cercato di aggiungere un DefaultValue nel mio pacchetto di impostazioni di una stringa vuota.
Soluzione
[NSString stringWithFormat:@"%@", nil];
Questo crea qualcosa del genere:
@"(null)"
e pertanto non è né zero
né uguale a @ " "
.
a proposito
- Non è necessario
stringWithFormat:
. - Non cercare
string == nil
ma!string
- Non è necessario verificare la presenza di una stringa vuota, poiché esiste un set o è
nil
. - Usa un nome migliore di
t_gName
, non c'è motivo per i nomi brevi.
In questo modo:
- (BOOL)isFirstTimeLogin
{
NSString *groupIdentifier = [[NSUserDefaults standardUserDefaults]
objectForKey:kGroupIdentifierKey];
if (!groupIdentifier) {
DLog(@"First time login.");
return YES;
}
DLog(@"Not a first time login.");
return NO;
}
Altri suggerimenti
Prova questo:
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedFirstTime"])
{
// app already launched
NSLog(@"app already launched");
}
else
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedFirstTime"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"First Time");
// This is the first launch ever
}
}