2010-11-19 6 views
3

Ich übergebe einen Integer-Wert an das NSUserDefault-Objekt, das zur Verwendung beim Laden meiner App gespeichert wird. I HAD es funktioniert einwandfrei, bis ich versuchte, diesen ganzzahligen Wert zu einem Floaten zu wechseln. Es verursachte eine ganze Reihe von Problemen, also korrigierte ich meinen Ansatz und befehligte meinen Weg zurück in die Sicherheit von ganzen Zahlen ... oder so, dachte ich.Nimmt NSUserDefault einige Sekunden in Anspruch, um die Werte zu registrieren, die ich übergeben habe?

Wenn ich den Wert speicherte, konnte ich meinen Simulator sofort schließen, und die Konsole spuckte die korrekt gespeicherte Nummer ohne Probleme aus. JETZT, nach diesem dummen Float-Chaos (Könnte ich mein NSUserDefault-Objekt beschädigt haben? Das klingt einfach doof ...), die richtige Zahl zu bekommen ist etwas Glücksspiel.

Ich habe eine Reihe von NSLogs durchlaufen und kann bestätigen, dass der Wert, den ich speichere, wenn ich save drücke, korrekt an die set-Methode in der UserDefault-Klasse übergeben wird. Die Set-Methode ruft den Wert korrekt und setzt sie dann auf das NSUD Objekt wie folgt:

[self setObject:[NSNumber numberWithInteger:num] forKey:savedNum]; 

Wenn ich die get-Methode für das Objekt ausgeführt werden, die Konsole druckt korrekt den Wert. Wenn die App geladen wird, ruft sie die gleiche get-Methode auf, die ich gerade getestet habe, aber sie gibt nicht immer das Richtige zurück. Oftmals ist es der Wert des vorherigen Speichers, der angezeigt wird.

Wenn ich die Speichern-Taste drücke und 5 Sekunden warte, bevor ich die App schließe, hat es vorher richtig funktioniert, aber es ist selten. Wenn ich 10 Sekunden warte, spuckt es die richtige Nummer aus.

Warum hätte die Zeit etwas mit dieser Operation zu tun? Ich bin gerade bei einem vollständigen Verlust, warum dies vorkommt, vor allem, weil ich es gerade gestern richtig gearbeitet hatte ...

Alle Gedanken oder Eingaben würden geschätzt werden !!

Antwort

9

Haben Sie sichergestellt, -synchronize die NSUserDefaults?

+0

Ich bin nicht vertraut damit, wie synchronisiere ich? – Jerry

+0

Guter Anruf - aber ich denke, dass es nur steuert, dass es in Flash geschrieben wird. (Laut der Dokumentation) Es hält einen "In-Memory-Cache" - der Dinge beim Zurücklesen konsistent machen sollte - noch bevor es in Flash geschrieben wurde. – Brad

+0

@Jerry Do [nsudobjectnameshere synchronisieren]. –

1

Ich habe dieses Verhalten nie bemerkt - und ich denke nicht, dass es eine Verzögerung gibt.

So ist die naheliegendste Frage ist:

Wenn Sie ein tun:

[[NSUserDefaults standardUserDefaults] setInteger:value ForKey:@"myInteger"]; 
NSLog(@"It is %d",[[NSUserDefaults standardUserDefaults] integerForKey:@"myInteger"]); 

Bekommen Sie den richtigen Wert?

+0

Ja, warf die oben NSLog in mit einigen meiner anderen produziert den gleichen Wert. Wenn es ist, bevor ich die App herunterschliesse, ist es korrekt, wenn es während des Ladevorgangs ist, produziert es die falsche Nummer ... so komisch !! – Jerry

0

Ich glaube, das ist ein Simulator-Fehler. Öffnen Sie mit Ihrer Anwendung auf dem simulierten Gerät Settings.app. Beenden Sie jetzt Settings.app. Ihre Standardeinstellungen beginnen plötzlich zu arbeiten.

Siehe auch diesen Thread in den Apple Diskussionsforen über die non-sticky NSUserDefaults issue.

+0

Also nur im Simulator, gehen Sie in die Einstellungen App, wie die mit den Zahnrädern? Öffnen und dann schließen? Ich habe das versucht und es hat nicht geholfen ... Ich werde es auf mein Gerät werfen, wenn ich nach Hause komme und sehen, ob das hilft. Ich hoffe, das ist nur ein Simulator-Bug ... danke – Jerry

+0

Ich weiß, dass ich in dasselbe Simulator-Problem gerannt bin und dieser Tanz schien es für mich zu reparieren. :\ Es tut uns leid! –