Мне было любопытно, что считается лучшим способом управлять чтением и записью файла plist High Score. Мой высокий класс Score является:Советы по сохранению высокой оценки (iPhone, Cocoa Touch)
@interface HighScore : NSObject <NSCoding> {
NSString *name;
int score;
int level;
int round;
NSDate *date;
}
Теперь, я мог бы сделать метод А, добавить методы 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
И написать все это с помощью:
if (![NSKeyedArchiver archiveRootObject:highScoresList toFile:path]) ...
Чтение его обратно в было бы довольно прямолинейно. Однако файл plist, ИМХО, выглядит как дерьмо.
Или я мог бы использовать метод Б:
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];
}
и написать все это с помощью:
if (![array writeToFile:path atomically:YES]) ...
Чтение его обратно в это чуть-чуть сложнее. Но файл plist выглядит намного чище (меньше и компактнее).
Любые мысли? Я пропустил что-то намного проще? (Я хочу, чтобы High Scores отличались от NSUserDefaults, поэтому я не использую это).
На самом деле методы NSCoding также могут выполнять управление версиями с использованием метода класса «+ (NSInteger)». Вот как я делал обновления в своем приложении. –