ios - NSUserDefaults wird nicht gespeichert




sprite-kit (5)

Ich habe ein Problem in meiner Sprite Kit-App, wo meine NSUserDefaults Variable nicht funktioniert. In createSceneContents (von dem ich weiß, dass es aufgerufen wird)

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 du auf SKLabelNode , um den Schwierigkeitsgrad zu ändern und dieser Code wird aufgerufen

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 das Programm stoppe und es erneut abspiele, sagt es immer nur Schwierigkeit: Einfach. Irgendwelche Vorschläge?


Answers

Wenn du sagst "Stoppe das Programm", was meinst du? Laufen Sie im Debugger und beenden Sie die App und führen Sie sie erneut aus? NSUserDefaults Ihre Änderungen nicht sofort bei. Rufen Sie entweder [defaults synchronize] nach dem Schreiben wichtiger Daten auf oder fügen Sie mindestens einen solchen Aufruf der applicationDidEnterBackground Methode Ihres applicationDidEnterBackground . 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.


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

Die Werte werden beim Aufruf von setObject:forKey: in temporärem Speicher setObject:forKey: Wenn Sie also versuchen, objectForKey: nach setObject:forKey: gibt es den Wert im Speicher zurück, falls vorhanden, und wenn nicht, sucht es nach Was wurde für die Langzeitspeicherung gespeichert?

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 damit, wie rmaddy erklärt, wenn Sie etwas haben, das dringend in den permanenten Speicher sofort gespeichert werden muss, können Sie immer synchronize aufrufen. 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 zu synchronize wie rmaddy vorschlägt. Beachten Sie jedoch, dass diese Methode nicht aufgerufen wird, wenn Sie die App beenden.


Lagern:

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

Ich habe einen anderen Grund gefunden, warum NSUserDefaults nicht speichert, folgender Code kann 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 init-Fehler zweimal zu NSUserDefaults .


[[NSUserDefaults standardUserDefaults] setValue:aString forKey:aKey]





ios nsuserdefaults sprite-kit