Il y a deux façons de stocker un NSDate dans NSUserDefaults que j'ai rencontrées.
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 - timeIntervalDepuis 1970
// 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];
Avantages et inconvénients
Option 1
Cela semble être compact et logique. Cependant, je crains que cela ne se passe mal à cause des bogues du formateur de date .
Option 2
Cela semble maladroit. Je ne suis pas non plus sûr de l'exactitude de celui-ci - dans un test que j'ai fait, lorsque j'ai récupéré la date, il était dépassé de 48 secondes, malgré les documents Apple disant que NSTimeInterval a une "précision inférieure à la seconde".
Exigences
Quelle que soit la méthode que je choisis, elle doit être:
Précis à moins d'une seconde.
Lisible et fiable.
Ma question
L'inexactitude de l'option 2 est-elle due au fait que je fais quelque chose de mal?
Laquelle de ces deux options utiliseriez-vous?
Y a-t-il une autre option dont je ne suis pas au courant?
Merci!
la source
Pour l'option n ° 1, je ne crois pas qu'un formateur de date soit impliqué. Peut-être sous le capot, mais j'imagine que ce n'est pas cassé. La date est stockée sous la forme ISO 8601 .
Pour l'option n ° 2, utilisez
-setDouble:forKey:
et à la-doubleForKey
place desfloat
versions basées sur. Cela pourrait être la cause de vos erreurs de précision.la source
Utilisez NSUserDefaults; les dates sont stockées à l'heure zoulou, il n'y a donc pas de problèmes de fuseau horaire à s'inquiéter. Stockez-le dans votre fuseau horaire, retirez-le dans un autre fuseau horaire, tout ira bien, le système gère la conversion (pas de formateur de date à craindre).
la source
Si vous enregistrez la date d'expiration de l'API Facebook Graph, j'utiliserais * Option 2 * .
La deuxième option peut être facilement convertie en chaîne (en utilisant stringWithFormat). Plus important encore, cela fonctionne pour l'API Graph.
De plus, vous n'avez pas à vous soucier du format de votre date. Ne pas traiter NSDateFormatter vaut la possibilité d'une erreur de 48 secondes.
la source