2

В настоящее время я сохраняю 30 целых чисел в файл, создав NSMutableDictionary, а затем используя NSKeyedArchiver для его сохранения.Xcode - наиболее упорядоченный способ сохранения большого количества целых чисел в файл

@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 ...] ;.

Но как бы я изменить цифры в строке обратно в целых числах?

Или я использую массив как-то?

Дай я Идея, и я открыт для многих предложений.

Thx много я мало знаю о программировании.

+1

Только мысль, если вы хотите, чтобы урезать общее количество строк в коде, вы можете объявить целые числа следующим образом. «NSInteger один, два, три, четыре, пять»; –

+0

Хорошо спасибо, что я этого не знал! – burkel

+0

Без проблем, рад помочь! –

ответ

3

Сохранение этих чисел в «NSString» объектов и архивирование их с помощью этого большого блока кода действительно кажутся действительно громоздкими.

Почему бы не сделать это с помощью "NSNumber" objects, в котором есть возможность архивирования? Вы можете выбросить все объекты «NSNumber» в массив (например, «highScoreENumber = [[NSNumber alloc] initWithInt: highScoreE];») и записать его в файл, а затем загрузить файл при последующих запусках.

EDIT:

Я не могу порт вашего кода для вас, но проверить это:

@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]; 
} 
+0

Извините, я не думаю, что понимаю, как это сделать. Очень ценится. – burkel

+0

Как это кодировать? Жаль, что я боюсь, я просто новичок в программировании. – burkel

+1

дайте мне знать, если мой образец кода поможет вам вообще. –