Reputation: 1311
I am trying to save multiple games and whenever I want to save one the first method is called. However, no matter what I do, [NSFileManager defaultManager]
keeps telling me that there is no file at [SaveGameManager filePath]
and [SaveGameManager savedGames]
keeps giving me nil objects. Any advice/help?
@implementation SaveGameManager
+(void)saveGameWithDate:(NSDate*)date type:(NSInteger)type allMoves:(NSArray*)allMoves players:(NSArray*)players playerTimes:(NSArray*)playerTimes delayTime:(double)delayTime useTimer:(BOOL)useTimer delayOption:(NSInteger)delayOption drawOfferState:(NSInteger)drawOfferState resignationState:(NSInteger)resignationState current:(BOOL)current {
NSLog(@"saving game");
NSMutableArray* savedGames = [SaveGameManager savedGames];
if (!savedGames) {
savedGames = [NSMutableArray array];
}
NSMutableDictionary* dict = [@{@"date" : date, @"boardType" : @(type), @"allMoves" : allMoves, @"players" : players, @"delayTime" : @(delayTime), @"useTimer" : @(useTimer), @"delayOption" : @(delayOption), @"drawOfferState" : @(drawOfferState), @"resignationState" : @(resignationState), @"current" : @(current)} mutableCopy];
if (playerTimes) {
dict[@"playerTimes"] = playerTimes;
}
[savedGames addObject:dict];
[savedGames writeToFile:[SaveGameManager filePath] atomically:YES];
}
+(NSString*)filePath {
static NSString* path;
if (!path) {
path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"SavedGames.plist"];
}
return path;
}
+(NSMutableArray*)savedGames {
return [NSMutableArray arrayWithContentsOfFile:[SaveGameManager filePath]];
}
@end
Upvotes: 0
Views: 62
Reputation: 4244
Use this code to save a NSDictionary in Plist format in Application document.
+ (void)saveSessionToDisk:(NSDictionary *)session {
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithDictionary:session];
NSError *error;
NSData *archiveData = [NSKeyedArchiver archivedDataWithRootObject:dictionary];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *fullPath = [documentsDir stringByAppendingPathComponent:@"SavedSession.plist"];
[archiveData writeToFile:fullPath options:NSDataWritingAtomic error:&error];
}
Use this code to Load NSDictionary from Plist that you saved earlier.
+ (NSDictionary *)loadSessionFromDisk
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *fullPath = [documentsDir stringByAppendingPathComponent:@"SavedSession.plist"];
DLog(@"%@",fullPath);
NSFileManager *fileManager =[NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:fullPath]) {
NSMutableDictionary *dict = nil;
@try {
NSData *archiveData = [NSData dataWithContentsOfFile:fullPath];
dict = (NSMutableDictionary*)[NSKeyedUnarchiver unarchiveObjectWithData:archiveData];
if ([dict count] > 0) {
return dict;
} else {
return nil;
}
} @catch (NSException *e) {
}
} else {
return nil;
}
}
Always use this condition before you try to load NSDictionary :
if ([[UtilityFunctions loadSessionFromDisk] isKindOfClass:[NSDictionary class]]) {
NSDictionary *myDictionary = [UtilityFunctions loadSessionFromDisk];
}
Upvotes: 2