ios - NSUserDefaults wird nicht gespeichert




2 Answers

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.

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?




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



Related

ios nsuserdefaults sprite-kit