Xcode - 将大量整数保存到文件的最简化方法

时间:2012-06-05 09:56:27

标签: objective-c xcode cocoa-touch nsmutabledictionary nskeyedarchiver

我目前通过创建NSMutableDictionary然后使用NSKeyedArchiver保存它来将30个整数保存到文件中。

@interface:
NSInteger highScoreE;
NSInteger highScoreM;
NSInteger highScoreH;
NSInteger highScoreI;

NSInteger highScoreComE;
NSInteger highScoreComM;
NSInteger highScoreComH;
NSInteger highScoreComI;

NSInteger totalGamesWonE;
NSInteger totalGamesWonM;
NSInteger totalGamesWonH;
NSInteger totalGamesWonI;

NSInteger totalGamesLostE;
NSInteger totalGamesLostM;
NSInteger totalGamesLostH;
NSInteger totalGamesLostI;

NSInteger totalPointsForE;
NSInteger totalPointsForM;
NSInteger totalPointsForH;
NSInteger totalPointsForI;

NSInteger totalPointsAgainstE;
NSInteger totalPointsAgainstM;
NSInteger totalPointsAgainstH;
NSInteger totalPointsAgainstI;

NSInteger highScore;
NSInteger highScoreCom;
NSInteger totalGames;
NSInteger totalGamesWon;
NSInteger totalGamesLost;
NSInteger totalPointsFor;
NSInteger totalPointsAgainst;

@property(nonatomic) NSInteger highScoreE;
@property(nonatomic) NSInteger highScoreM;
@property(nonatomic) NSInteger highScoreH;
@property(nonatomic) NSInteger highScoreI;

@property(nonatomic) NSInteger highScoreComE;
@property(nonatomic) NSInteger highScoreComM;
@property(nonatomic) NSInteger highScoreComH;
@property(nonatomic) NSInteger highScoreComI;

@property(nonatomic) NSInteger totalGamesWonE;
@property(nonatomic) NSInteger totalGamesWonM;
@property(nonatomic) NSInteger totalGamesWonH;
@property(nonatomic) NSInteger totalGamesWonI;

@property(nonatomic) NSInteger totalGamesLostE;
@property(nonatomic) NSInteger totalGamesLostM;
@property(nonatomic) NSInteger totalGamesLostH;
@property(nonatomic) NSInteger totalGamesLostI;

@property(nonatomic) NSInteger totalPointsForE;
@property(nonatomic) NSInteger totalPointsForM;
@property(nonatomic) NSInteger totalPointsForH;
@property(nonatomic) NSInteger totalPointsForI;

@property(nonatomic) NSInteger totalPointsAgainstE;
@property(nonatomic) NSInteger totalPointsAgainstM;
@property(nonatomic) NSInteger totalPointsAgainstH;
@property(nonatomic) NSInteger totalPointsAgainstI;

@property(nonatomic) NSInteger highScore;
@property(nonatomic) NSInteger highScoreCom;
@property(nonatomic) NSInteger totalGames;
@property(nonatomic) NSInteger totalGamesWon;
@property(nonatomic) NSInteger totalGamesLost;
@property(nonatomic) NSInteger totalPointsFor;
@property(nonatomic) NSInteger totalPointsAgainst;


@implementation;

NSString *nssTotalPointsFor = [NSString stringWithFormat:@"%i", totalPointsFor];
NSString *nssTotalPointsForE = [NSString stringWithFormat:@"%i", totalPointsForE];
NSString *nssTotalPointsForM = [NSString stringWithFormat:@"%i", totalPointsForM];
NSString *nssTotalPointsForH = [NSString stringWithFormat:@"%i", totalPointsForH];
NSString *nssTotalPointsForI = [NSString stringWithFormat:@"%i", totalPointsForI];
//create dictionary
NSMutableDictionary* myDict = [[NSMutableDictionary alloc] init];

//add things to dictionary (game stats)
[myDict setObject:nssTotalPointsFor forKey:@"totalPointsFor"];
[myDict setObject:nssTotalPointsForE forKey:@"totalPointsForE"];
[myDict setObject:nssTotalPointsForM forKey:@"totalPointsForM"];
[myDict setObject:nssTotalPointsForH forKey:@"totalPointsForH"];
[myDict setObject:nssTotalPointsForI forKey:@"totalPointsForI"];

//get the path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [paths objectAtIndex:0];
NSString *path = [documentPath stringByAppendingPathComponent:@"stats.save"];

// save to file
[NSKeyedArchiver archiveRootObject:myDict toFile:path];

然后我对其他整数也这样做。

然后我必须将这些字符串读回整数:

//get the path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [paths objectAtIndex:0];
NSString *path = [documentPath stringByAppendingPathComponent:@"stats.save"];   

//create dictionary
NSMutableDictionary* myDict = [[NSMutableDictionary alloc] init];

//read from file
myDict = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSString *nssPlayerHighScore = [myDict objectForKey:@"playerHighScore"];
highScore = [nssPlayerHighScore intValue];

NSString *nssComputerHighScore = [myDict objectForKey:@"computerHighScore"];
highScoreCom = [nssComputerHighScore intValue];

NSString *nssTotalPointsFor = [myDict objectForKey:@"totalPointsFor"];
totalPointsFor = [nssTotalPointsFor intValue];

NSString *nssTotalPointsAgainst = [myDict objectForKey:@"totalPointsAgainst"];
totalPointsAgainst = [nssTotalPointsAgainst intValue];

NSString *nssTotalGames = [myDict objectForKey:@"totalGames"];
totalGames = [nssTotalGames intValue];

NSString *nssTotalGamesWon = [myDict objectForKey:@"totalGamesWon"];
totalGamesWon = [nssTotalGamesWon intValue];

NSString *nssTotalGamesLost = [myDict objectForKey:@"totalGamesLost"];
totalGamesLost = [nssTotalGamesLost intValue];

NSString *nssPlayerHighScoreE = [myDict objectForKey:@"playerHighScoreE"];
 highScoreE = [nssPlayerHighScoreE intValue];

NSString *nssComputerHighScoreE = [myDict objectForKey:@"computerHighScoreE"];
highScoreComE = [nssComputerHighScoreE intValue];

然后对其他整数也是如此。

我发现这种方式非常麻烦且烦人但我不知道其他任何保存整数的方法。

一般来说,最简化的保存方式是什么?

我不知道NSKeyedArchiver是否存在问题,或者我是否应该使字符串包含多个整数(例如.NSString * nssTotalPointsFor = [NSString stringWithFormat:@“%i,%i,...”,totalPointsFor ,totalPointsAgainst,...];。

但是,我如何将字符串中的数字更改回整数?

或者我以某种方式使用数组?

告诉我你的想法,我愿意接受很多建议。

很多我对编程知之甚少。

1 个答案:

答案 0 :(得分:3)

将这些数字存储到“NSString”对象中并使用这一大块代码存档它们确实看起来非常麻烦。

为什么不对内置了归档功能的"NSNumber" objects执行此操作?您可以将所有这些“NSNumber”对象抛出到一个数组中(例如“highScoreENumber = [[NSNumber alloc] initWithInt: highScoreE];”)并将其写入文件,然后在后续启动时加载该文件。

编辑:

我无法为您移植代码,但请查看:

@interface:
{
    NSNumber * highScore;
    NSNumber * highScoreCom;
}

@property(nonatomic, retain) NSNumber * highScore;
@property(nonatomic, retain) NSNumber * highScoreCom;

@implementation;

//create dictionary
NSMutableDictionary* myDict = [[NSMutableDictionary alloc] init];

if(myDict)
{
    //add things to dictionary (game stats)
    [myDict setObject:highScore forKey:@"highScore"];
    [myDict setObject:highScoreCom forKey:@"highScoreCom"];

    //get the path
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [paths objectAtIndex:0];
    NSString *path = [documentPath stringByAppendingPathComponent:@"stats.save"];

    BOOL successfulWrite = [myDict writeToFile: path atomically: YES];
    if(successfulWrite == NO)
    {
        NSLog( @"could not write my file to path %@", path );
    }
    // if *not* using ARC, don't forget to release
    [myDict release];
}