web-dev-qa-db-fra.com

Quel est le moyen optimal de stocker un NSDate dans NSUserDefaults?

Il existe deux manières de stocker un NSDate dans NSUserDefaults.

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

Avantages et inconvénients

Option 1

Cela semble être compact et logique. Cependant, je crains que cela ne se passe mal à cause de bogues Date Formatter .

Option 2

Cela semble être maladroit. Je ne suis pas sûr non plus de son exactitude - lors d’un test que j’ai fait, lorsque j’ai récupéré la date de retour, il était sorti au bout de 48 secondes, malgré le Apple Docs disant que NSTimeInterval a une "précision inférieure à la seconde" ".

Exigences

Quelle que soit la méthode que je choisis, ce doit être:

  1. Précis à une seconde près.

  2. Lisible et fiable.

Ma question

Est-ce que l'inexactitude avec l'option 2 est 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!

172
John Gallagher

Vous compliquez inutilement les choses. Pourquoi convertissez-vous la date en un intervalle de temps (puis l'intervalle de temps en une primitive différente)? Juste [sharedDefaults setObject:theDate forKey:@"theDateKey"] et en finir avec ça. NSDate est l'un des "principaux types" pris en charge par le format PLIST (dates, nombres, chaînes, données, dictionnaires et tableaux), vous pouvez donc le stocker directement.

Voir la documentation pour la preuve.

Il suffit de stocker et de récupérer la date directement et de la regarder faire la bonne chose (y compris les fuseaux horaires, la précision, etc.). Il n'y a aucun formateur impliqué, comme d'autres l'ont dit.

378
Joshua Nozzi

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 -doubleForKey au lieu des versions basées sur float. Cela pourrait être la cause de vos erreurs de précision.

14
John Calsbeek

Utilisez NSUserDefaults; les dates sont stockées en heure zoulou, il n'y a donc pas de problème de fuseau horaire. Stockez-le dans votre fuseau horaire, extrayez-le dans un autre fuseau horaire, tout ira bien, le système gère la conversion (aucun formateur de date à craindre).

5
Ben Gottlieb

Si vous enregistrez la date d'expiration de l'API Facebook Graph, j'utiliserais l'option * Option 2 *.

L'option deux peut être facilement convertie en chaîne (à l'aide de 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 avec NSDateFormatter vaut la peine d'une erreur de 48 secondes.

0
Nate Symer