Como fazer corretamente o trabalho (recuperar valores) com NSUserDefaults
-
03-07-2019 - |
Pergunta
Eu tenho um método simples no meu código que é semelhante ao seguinte:
- (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;
}
Simplesmente o que isso faz é ir para as configurações do bundle, e recuperar um valor de uma PSTextFieldSpecifier. Se eu for manualmente e adicionar algum texto arbitrário, o código funciona como esperado. No entanto, sempre que eu primeiro instalar o aplicativo em um novo dispositivo, a primeira condição está executando como falsa, que deve ser verdade. Após percorrendo o código, gdb prova que o objeto é de fato nula, bem como:
(GDB) po t_gName
(Null)
O que estou possivelmente fazendo de errado aqui? Por que é a condição está a falhar pela primeira vez que o aplicativo está instalado e t_gName é um vazio / PSTextFieldSpecifier nulo. Eu mesmo fui tão longe como tentar adicionar um valor padrão em minhas configurações do bundle de uma cadeia vazia.
Solução
[NSString stringWithFormat:@"%@", nil];
Isso cria algo como isto:
@"(null)"
e, portanto, nem nil
nem igual a @""
.
pela maneira
- Você não precisa
stringWithFormat:
em tudo. - Não verificar para
string == nil
mas para!string
- Você não tem que verificar se há uma cadeia vazia, como há um conjunto ou de
nil
. - Use um nome melhor do que
t_gName
, não há nenhuma razão para nomes curtos.
Como esta:
- (BOOL)isFirstTimeLogin
{
NSString *groupIdentifier = [[NSUserDefaults standardUserDefaults]
objectForKey:kGroupIdentifierKey];
if (!groupIdentifier) {
DLog(@"First time login.");
return YES;
}
DLog(@"Not a first time login.");
return NO;
}
Outras dicas
Tente isto:
-(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
}
}