J'étais curieux de savoir quelle est la meilleure façon de gérer la lecture et l'écriture d'un fichier plist High Score. Ma haute classe Le score est:Conseils sur la persistance High Score (iPhone, Cocoa Touch)
@interface HighScore : NSObject <NSCoding> {
NSString *name;
int score;
int level;
int round;
NSDate *date;
}
Maintenant, je pourrais faire la méthode A, ajouter des méthodes NSCoding:
- (void) encodeWithCoder: (NSCoder *) coder {
[coder encodeObject: name
forKey: kHighScoreNameKey];
[coder encodeInt: score
forKey: kHighScoreScoreKey];
[coder encodeInt: level
forKey: kHighScoreLevelKey];
[coder encodeInt: round
forKey: kHighScoreRoundKey];
[coder encodeObject: date
forKey: kHighScoreDateKey];
} // encodeWithCoder
- (id) initWithCoder: (NSCoder *) decoder {
if (self = [super init]) {
self.name = [decoder decodeObjectForKey: kHighScoreNameKey];
self.score = [decoder decodeIntForKey: kHighScoreScoreKey];
self.level = [decoder decodeIntForKey: kHighScoreLevelKey];
self.round = [decoder decodeIntForKey: kHighScoreRoundKey];
self.date = [decoder decodeObjectForKey: kHighScoreDateKey];
}
return (self);
} // initWithCoder
Et tout écrire avec:
if (![NSKeyedArchiver archiveRootObject:highScoresList toFile:path]) ...
relisant dans serait assez simple. Cependant, le fichier plist, à mon humble avis, ressemble à de la merde.
Ou je pourrais employer la méthode B:
NSMutableArray *array = [NSMutableArray arrayWithCapacity:20];;
for (HighScore *hs in highScoresList) {
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:
hs.name, kHighScoreNameKey,
[NSNumber numberWithInteger:hs.score], kHighScoreScoreKey,
[NSNumber numberWithInteger:hs.level], kHighScoreLevelKey,
[NSNumber numberWithInteger:hs.round], kHighScoreRoundKey,
hs.date, kHighScoreDateKey,
nil];
[array addObject:dict];
[dict release];
}
et écrire tout avec:
if (![array writeToFile:path atomically:YES]) ...
relisant en est un peu plus difficile minuscule. Mais le fichier plist est beaucoup plus propre (plus petit et compact).
Des pensées? Est-ce que je manque quelque chose qui est beaucoup plus simple? (Je veux séparer les scores élevés de NSUserDefaults, donc je n'utilise pas cela).
En fait, les méthodes NSCoding peuvent également effectuer des versions en utilisant la méthode de classe "+ (NSInteger)". C'est comme ça que je faisais des mises à niveau dans mon application. –