2014-02-19 6 views
5

Ich habe ein Problem in meiner Sprite Kit App, wo meine NSUserDefaults Variable nicht funktioniert. In createSceneContents (was ich weiß, genannt wird)NSUserDefaults nicht speichern

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

und dann, wenn Sie auf der SKLabelNode die Schwierigkeit zu ändern, und dieser Code aufgerufen wird

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"]); 

aber wenn ich stoppen Sie das Programm und führen Es sagt immer wieder: Schwierigkeit: Einfach. Irgendwelche Vorschläge?

Antwort

12

Wie rmaddy's Antwort erklärt, schreibt NSUserDefaults nicht sofort Daten in den Langzeitspeicher.

Die Werte werden im temporären Speicher gespeichert, wenn Sie setObject:forKey: rufen, wenn Sie also immer versuchen objectForKey: nach setObject:forKey: zu nennen, wird es den Wert im Speicher zurück, wenn es vorhanden ist, und wenn nicht, geht es zu suchen, was zu retten ist schon zur Langzeitspeicherung.

Im Hintergrund speichert das Gerät diese Werte eventuell im permanenten Speicher. Es ist etwas, was das Betriebssystem handhabt, aber im normalen Betrieb Ihrer App sollte es nicht notwendig sein, diese Werte die meiste Zeit sofort im permanenten Speicher abzulegen, also lassen Sie das OS dies zu Zeiten tun, wenn es dafür optimiert wurde (I Stellen Sie sich vor, das Betriebssystem synchronisiert wahrscheinlich die Standardeinstellungen jeder App auf einmal und versucht so viel wie möglich, dies zu tun, wenn sich der Prozessor wahrscheinlich im Leerlauf befindet.

Aber mit diesem gesagt, wie rmaddy erklärt, wenn Sie etwas haben, das unbedingt sofort in den permanenten Speicher gespeichert werden muss, können Sie immer synchronize anrufen. Beachten Sie jedoch Folgendes: Solange Ihre App im Debug-Modus nicht beendet wird, werden die Werte gespeichert, die Sie in den Benutzereinstellungen gespeichert haben.

Aber um Ihrer selbst willen, wenn Sie absolut sicher sein wollen, können Sie es anrufen synchronize in applicationDidEnterBackground wie rmaddy schlägt. Beachten Sie jedoch, dass diese Methode nicht aufgerufen wird, wenn Sie die App beenden.

10

Wenn Sie sagen, Sie "stoppen das Programm", was meinst du? Laufen Sie im Debugger und beenden Sie die App und führen Sie sie erneut aus? NSUserDefaults behält Ihre Änderungen nicht sofort bei. Rufen Sie entweder [defaults synchronize] an, nachdem Sie wichtige Daten geschrieben haben, oder fügen Sie mindestens einen solchen Anruf der Methode applicationDidEnterBackground Ihres App-Delegierten hinzu. Und dann stellen Sie sicher, dass Sie Ihre App in den Hintergrund stellen, bevor Sie sie löschen, um sicherzustellen, dass die Daten zuerst geschrieben werden.

+0

danke. Mit den [Standards synchronisieren] funktioniert es gut – Lucas

1

zu speichern:

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

Abrufen:

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

ich einen anderen Grund gefunden, warum NSUserDefaults Speichern nicht, können folgende Code machen Wert in NSUserDefaults nicht speichern:

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

Sie können NSUserDefaults in Ihrem Projekt suchen, um diesen zweifachen Init-Fehler abzufangen.