Was ist der optimale Weg, um eine NSDate in NSUserDefaults zu speichern?
-
19-09-2019 - |
Frage
ist Es gibt zwei Möglichkeiten zur Herstellung eines NSDate in NSUserDefaults speichern, die ich kenne.
Option 1 - setObject: forKey:
// Set
NSDate *myDate = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"];
// Get
NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"];
Option 2 - timeIntervalSince1970
// Set
NSDate *myDate = [NSDate date];
NSTimeInterval myDateTimeInterval = [myDate timeIntervalSince1970];
[[NSUserDefaults standardUserDefaults] setFloat:myDateTimeInterval forKey:@"myDateKey"];
// Get
NSTimeInterval myDateTimeInterval = [[NSUserDefaults standardUserDefaults] floatForKey:@"myDateKey"];
NSDate *myDate = [NSDate dateWithTimeIntervalSince1970:myDateTimeInterval];
Vor- und Nachteile
Option 1
Das scheint kompakt und logisch zu sein. Allerdings, ich habe Sorgen darüber schief gehen wegen Datum Formatter Bugs .
Option 2
Das scheint plump zu sein. Ich bin auch nicht sicher für die Richtigkeit der es - in einem Test, den ich tat, als ich das Datum wieder abgerufen war, indem 48 Sekunden, trotz der Apple-Docs sagen, dass NSTimeInterval hat „Subsekunden Genauigkeit“
.Anforderungen
Egal welche Methode ich wählen, es muss sein:
-
Precise innerhalb einer Sekunde.
-
Lesbare und zuverlässig.
Meine Frage
Ist die Ungenauigkeit mit Option 2, weil ich etwas falsch mache ich?
Welche von diesen beiden Möglichkeiten würden Sie nutzen?
Gibt es eine andere Möglichkeit, die ich bin mir nicht bewusst?
Danke!
Lösung
Sie erschweren unnötig Dinge. Warum konvertieren Sie das Datum auf ein Zeitintervall (dann das Zeitintervall auf einen anderen primitiven)? [sharedDefaults setObject:theDate forKey:@"theDateKey"]
einfach und mit ihr geschehen. NSDate ist eine der „Haupttypen“ unterstützt durch das PLIST-Format (Daten, Zahlen, Strings, Daten, Wörterbücher und Arrays), so können Sie es einfach direkt speichern.
Siehe die Dokumentation Beweis.
Just speichern und das Datum abrufen direkt und beobachten Sie das Richtige tun (einschließlich Zeitzonen, Präzision, etc.). Es gibt keine Formatierer beteiligt, wie andere gesagt haben.
Andere Tipps
Für Option # 1, ich glaube nicht, ein Datum Formatter beteiligt ist. Möglicherweise unter der Haube, aber ich glaube es nicht kaputt ist. Das Datum wird rel="noreferrer"> ISO 8601 Form in
Für Option # 2, verwendet -setDouble:forKey:
und -doubleForKey
anstelle der float
-basierten Versionen. Das könnte die Ursache Ihrer Präzision Fehler sein.
Mit NSUserDefaults; Termine werden in Zulu Zeit gespeichert, so dass es keine Probleme Zeitzone zu kümmern. Bewahren Sie es in Ihrer Zeitzone, ziehen Sie es in einer anderen Zeitzone aus, man werde in Ordnung sein, das System übernimmt die Konvertierung (kein Datum Formatierer zu befürchten).
Wenn Sie das Verfallsdatum aus der Facebook Graph API speichern, würde ich * Option 2 * .
Option zwei leicht in einen String (unter Verwendung von string) umgewandelt werden. Am wichtigsten ist, es funktioniert für die Graph API.
Plus, Sie müssen nicht über das Format Ihres Datums kümmern. Nicht mit NSDateFormatter Umgang lohnt sich die Möglichkeit einer 48 Sekunden Fehler.