2013-09-23 4 views
0

У меня проблема с NSKeyedArchiver, которая довольно долго меня озадачивала и не может точно определить ошибку.iOS NSKeyedArchiver unarchive возвращает пустой массив

У меня есть изменяемый массив, состоящий из объектов класса «Устройство». В моей AppDelegate я держу 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; 
} 

я получаю пустой mutableArray от разархивирования процесса. Я использую ARC, не уверен, что это имеет к этому какое-то отношение.

ответ

2

Так что, по-видимому, я не знал, что вам нужно сначала сохранить свой корневой объект, в данном случае массив, в NSMutableDictionnary.

NSMutableDictionary *rootObject; 
rootObject = [NSMutableDictionary dictionary]; 

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

А затем сохраните файл rootObject с помощью NSKeyedArchiver. Странно, не видел этого ни в одном из уроков.

Таким образом, вы получаете следующие функции для загрузки и сохранения данных в 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

Большое спасибо! * Thumbs up * – ColdSteel

 Смежные вопросы

  • Нет связанных вопросов^_^