Мне было любопытно, что считается лучшим способом управления чтением и записью файла списка рекордов. Мой класс рекордов:
@interface HighScore : NSObject <NSCoding> {
NSString *name;
int score;
int level;
int round;
NSDate *date;
}
Теперь я мог бы сделать метод A, добавить методы 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, ИМХО, выглядит как дерьмо.
Или я мог бы использовать метод 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];
}
и запишите все это с помощью:
if (![array writeToFile:path atomically:YES]) ...
Чтение обратно немного сложнее. Но файл plist выглядит намного чище (меньше и компактнее).
Есть мысли? Я скучаю по чему-то, что намного проще? (Я хочу отделить рекорды от NSUserDefaults, поэтому не использую это).