2013-09-23 3 views
0

NSKeyedArchiver에 문제가있어 지금 당황스럽고 오류를 찾아 낼 수 없습니다.iOS NSKeyedArchiver unarchive가 빈 배열을 반환합니다.

나는 "Device"클래스의 객체로 구성된 가변 배열을가집니다. 내 AppDelegate에 나는 장치의 mutableArray을 유지하고 나는 다음과 같은 세 가지 기능을 가지고 : 나는 언 아카이빙 과정에서 빈 mutableArray가 계속

- (void) loadDataFromDisk { 
    self.devices = [NSKeyedUnarchiver unarchiveObjectWithFile: self.docPath]; 
    NSLog(@"Unarchiving"); 
} 

- (void) saveDataToDisk { 
    NSLog(@"Archiving"); 
    [NSKeyedArchiver archiveRootObject: self.devices toFile: self.docPath]; 
} 

- (BOOL) createDataPath { 
    if (docPath == nil) { 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 
     NSString *docsDir = [paths objectAtIndex:0]; 
     self.docPath = [docsDir stringByAppendingPathComponent: @"devices.dat"]; 
     NSLog(@"Creating path"); 
    } 

    NSLog(@"Checking path"); 

    NSError *error; 
    BOOL success = [[NSFileManager defaultManager] createDirectoryAtPath: docPath withIntermediateDirectories: YES attributes: nil error:&error]; 
    if (!success) { 
     NSLog(@"Error creating data path: %@", [error localizedDescription]); 
    } 
    return success; 
} 

. ARC를 사용하고 있습니다. ARC와 관련이 있는지 확실하지 않습니다.

답변

2

분명히 내가 모르는 부분은 루트 객체 (이 경우에는 배열)를 NSMutableDictionnary에 먼저 저장해야한다는 것입니다.

NSMutableDictionary *rootObject; 
rootObject = [NSMutableDictionary dictionary]; 

[rootObject setValue: self.devices forKey: @"devices"]; 

그런 다음 NSKeyedArchiver를 사용하여 rootObject를 저장하십시오. 이상한, 어떤 자습서에서도 이것을 보지 못했습니다.

그래서 NSKeyedArchiver에 데이터를로드하고 저장하기 위해 다음과 같은 함수가 필요합니다.

- (void) loadArrayFromArchiver { 
    NSMutableDictionary *rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile: [self getDataPath]]; 

    if ([rootObject valueForKey: @"devices"]) { 
     self.devices = [rootObject valueForKey: @"devices"]; 
    } 

    NSLog(@"Unarchiving"); 
} 

- (void) saveArrayToArchiver { 
    NSLog(@"Archiving"); 

    NSMutableDictionary *rootObject = [NSMutableDictionary dictionary]; 

    [rootObject setValue: self.devices forKey: @"devices"]; 

    [NSKeyedArchiver archiveRootObject: rootObject toFile: [self getDataPath]]; 
} 

- (NSString *) getDataPath { 
    self.path = @"~/data"; 
    path = [path stringByExpandingTildeInPath]; 
    NSLog(@"Creating path"); 
} 
+0

안녕하세요, 공유 해 주셔서 감사합니다. 동일한 문제가 있지만 답변을 이해하지 못합니다. (... 루트 객체는 사전이고, 키 배열을 넣으시겠습니까? 그런 다음 사전에 보관 취소하거나 배열에 보관 하시겠습니까? – ColdSteel

+0

전체 기능을 포함하여 도움이 되었기를 바랍니다. –

+0

대단히 감사합니다! * 엄지 손가락까지 * – ColdSteel