ハイスコアの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ファイルIMHOはうんざりのように見えます。
または私は方法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)version"クラスメソッドを使用してバージョン管理を行うこともできます。これは私のアプリでのアップグレードのやり方です。 –