NSUserDefaults no guarda

Estoy teniendo un problema en mi aplicación de kit de sprite donde mi variable NSUserDefaults no funciona. En createSceneContents (que sé que se llama)

 if (![defaults objectForKey:@"obj"]) { difficultyLabel.text = @"Difficulty: Easy"; [defaults setObject:@"Easy" forKey:@"obj"]; } else { difficultyLabel.text = [NSString stringWithFormat:@"Difficulty: %@", [defaults objectForKey:@"diff"]]; } 

y luego cuando hace clic en SKLabelNode para cambiar la dificultad y se llama a este código

 if ([label.text isEqualToString:@"Difficulty: Easy"]) { label.text = @"Difficulty: Hard"; [defaults setObject:@"Hard" forKey:@"obj"]; NSLog(@"%@",[defaults objectForKey:@"obj"]); } else { label.text = @"Difficulty: Easy"; [defaults setObject:@"Easy" forKey:@"obj"]; NSLog(@"%@",[defaults objectForKey:@"obj"]); 

pero cuando detengo el progtwig y lo vuelvo a ejecutar, siempre dice "Dificultad: Fácil". ¿Alguna sugerencia?

Como explica la respuesta de NSUserDefaults , NSUserDefaults no escribirá inmediatamente datos en el almacenamiento a largo ploop.

Los valores se guardan en la memory temporal cuando llama a setObject:forKey: por lo que si alguna vez intenta llamar a objectForKey: después de setObject:forKey: devolverá el valor en memory si existe, y si no, va a search lo que se ha guardado en el almacenamiento a largo ploop.

En segundo plano, el dispositivo finalmente saveá estos valores en un almacenamiento permanente. Es algo que maneja el sistema operativo, pero en la operación normal de su aplicación, no debería ser necesario almacenar inmediatamente estos valores en almacenamiento permanente la mayor parte del time, así que deje que el sistema operativo lo haga a veces cuando se haya optimizado para hacerlo (I imagina que el sistema operativo probablemente sincronice los valores pnetworkingeterminados de usuario de cada aplicación a la vez en un progtwig regular, y que, en la medida de lo posible, intente hacerlo cuando el procesador esté inactivo, probablemente).

Pero dicho eso, como explica rmaddy, si tienes algo que crucialmente se debe save en el almacenamiento permanente de inmediato, siempre puedes llamar a synchronize . Sin embargo, tenga en count que … siempre y cuando su aplicación no se elimine mientras está en modo de debugging, se almacenarán los valores que haya configurado para que se almacenen en los valores pnetworkingeterminados del usuario.

Pero, por su propio bien, si quiere estar absolutamente seguro, puede hacer una llamada para synchronize en applicationDidEnterBackground como lo sugiere rmaddy. Sin embargo, tenga en count que este método no se llama si elimina la aplicación.

Cuando dices que "detienes el progtwig", ¿qué quieres decir? ¿Estás corriendo en el depurador y matando la aplicación y volviendo a ejecutarla? NSUserDefaults no mantiene sus cambios inmediatamente. Llame a [defaults synchronize] después de escribir datos importantes o, al less, agregue dicha llamada al método applicationDidEnterBackground del delegado de su applicationDidEnterBackground . Y luego asegúrese de poner su aplicación en segundo plano antes de matarlo para asegurarse de que los datos se escriben primero.

Almacenar:

 NSString * str = @"name123"; NSUserDefaults *def=[NSUserDefaults standardUserDefaults]; [def setObject:str forKey:@"Key"]; [def synchronize]; NSLog(@"str = = %@",str); 

Para recuperar:

 NSUserDefaults *def=[NSUserDefaults standardUserDefaults]; NSString *str2 = [def valueForKey:@"Key"]; NSLog(@" Saved str = = %@",str2); 

Encontré otra razón por la que NSUserDefaults no guarda, el siguiente código puede hacer que el valor NSUserDefaults no guarde:

 NSUserDefaults *def= [[NSUserDefaults standardUserDefaults] init]; ... NSUserDefaults *def= [[NSUserDefaults standardUserDefaults] initWithSuiteName:@"123"]; 

Puede search NSUserDefaults en su proyecto para capturar esos dos errores init.