2012-10-01 2 views
0

Я обычно кодировать свои данные в NSFileWrapper, как это (я уезжаю из бита NSFileWrapper):Ключ не найден в объекте NSKeyedUnarchiver

-(NSData*)encodeObject:(id<NSCoding>)o { 
     @autoreleasepool {    
      NSMutableData *data = [NSMutableData data]; 
      NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
      [archiver encodeObject:o forKey:@"data"]; 
      [archiver finishEncoding]; 
      return data; 
     } 
    } 

И я обычно получаю мои данные обратно, делая это:

- (id)decodeObjectFromWrapperWithPreferredFilename:(NSString *)p { 

    NSFileWrapper *wrapper = [self.fileWrapper.fileWrappers objectForKey:p]; 
    if (!wrapper) { 
     NSLog(@"Unexpected error: Couldn't find %@ in file wrapper!", p); 
     return nil; 
    } 

    NSData *data = [wrapper regularFileContents]; 
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 

    NSLog(@"%@", [unarchiver decodeObjectForKey:@"data"]); 
    return [unarchiver decodeObjectForKey:@"data"]; 

} 

Иногда я получаю NSData назад (это не ноль), но [unarchiver decodeObjectForKey:@"data"] вернет NIL. Кажется, что нет никакого объекта для ключевого @ "данных", хотя он должен быть. Я думаю, что что-то должно было ошибиться при кодировании, но я не уверен, как это сделать. Могу ли я просто взять все, что есть в data, и закодировать его, не беспокоясь, если у него есть правильный ключ? Я имею в виду, что должны быть только один ключевой «данные».

+1

Почему ваш код так сложно? Почему бы просто не возвратить [NSKeyedArchiver archivedDataWithRootObject: o]; 'и' return [NSKeyedUnarchiver unarchiveObjectWithData: data]; '? – deanWombourne

+0

@deanWombourne Хороший вопрос. Я был настолько смущен NSFileWrapper, что я следовал примерам Apple и учебнику Вендерлиха .... так что, я думаю, я допустил ошибку слепо следуя свернутому коду, который я не понял на 100%. Я сейчас попробую попробовать и дам вам знать. Возможно, добавьте свой комментарий в ответ ниже? Благодаря! –

+1

Поскольку мой комментарий на самом деле не является _answer_ вашим вопросом - возможно, была причина, по которой вам нужна была такая сложность. Однако, как нет, см. Мой ответ ниже :) – deanWombourne

ответ

1

Почему ваш код настолько сложным :) NSKeyedArchiver класса есть вспомогательные методы, которые будут делать то, что вы хотите больше просто:

// to turn an object into NSData 
return [NSKeyedArchiver archivedDataWithRootObject:o]; 

// To turn NSData into your object again 
return [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
+0

Хммм ... моя единственная проблема в том, что return [NSKeyedUnarchiver unarchiveObjectWithData: data]; не будет деактивировать данные с определенным ключом (теперь он всегда будет возвращать нуль, поскольку мои данные ранее были «связаны» с моим свернутым кодом). Есть ли способ извлечь объект, не зная его ключ? –