Cómo trabajar correctamente (recuperar valores) con NSUserDefaults
-
03-07-2019 - |
Pregunta
Tengo un método simple en mi código que se parece a lo siguiente:
- (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;
}
Simplemente, lo que hace es ir al paquete de configuración y recuperar un valor de un PSTextFieldSpecifier. Si entro manualmente y agrego un texto arbitrario, el código funciona como se esperaba. Sin embargo, cada vez que instalo la aplicación en un nuevo dispositivo, la primera condición se ejecuta como falsa, lo que debería ser cierto. Después de recorrer el código, gdb prueba que el objeto también es nulo:
(gdb) po t_gName
(nulo)
¿Qué estoy haciendo mal aquí? ¿Por qué es que la condición falla por primera vez que la aplicación se instala y t_gName es un PSTextFieldSpecifier vacío / nulo? Incluso llegué a intentar agregar un Valor predeterminado en mi paquete de configuración de una cadena vacía.
Solución
[NSString stringWithFormat:@"%@", nil];
Esto crea algo como esto:
@"(null)"
y, por lo tanto, no es nil
ni es igual a @ " "
.
por cierto
- No necesita
stringWithFormat:
en absoluto. - No verifique la cadena
== nil
sino la!string
- No tiene que verificar si hay una cadena vacía, ya que hay un conjunto o es
nil
. - Use un nombre mejor que
t_gName
, no hay razón para los nombres cortos.
Me gusta esto:
- (BOOL)isFirstTimeLogin
{
NSString *groupIdentifier = [[NSUserDefaults standardUserDefaults]
objectForKey:kGroupIdentifierKey];
if (!groupIdentifier) {
DLog(@"First time login.");
return YES;
}
DLog(@"Not a first time login.");
return NO;
}
Otros consejos
Prueba esto:
-(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
}
}