我很好奇什麼被認爲是管理高分數plist文件的讀寫的更好方法。我的最高得分類是:關於高分持久性的建議(iPhone,Cocoa Touch)
@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,所以我沒有使用它)。
實際上,NSCoding方法也可以使用「+(NSInteger)版本」類方法進行版本控制。這是我用來在我的應用程序中進行升級的方式。 – 2009-07-02 20:22:37