Ключ не найден в объекте NSKeyedUnarchiver
-
12-12-2019 - |
Вопрос
Обычно я кодирую свои данные в NSFileWrapper
вот так (я не учитываю бит NSFileWrapper):
-(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"]
вернет НОЛЬ.Кажется, что для ключа @"data" нет объекта, хотя он должен быть.Я предполагаю, что что-то пошло не так при кодировании, но я не знаю, как это исправить.Могу ли я просто взять все, что есть в data
и закодировать его, не беспокоясь о том, правильный ли у него ключ?Я имею в виду, что всегда должны быть только одни ключевые «данные».
Решение
Почему ваш код такой сложный :) NSKeyedArchiver
В классе есть вспомогательные методы, которые будут делать то, что вы хотите, проще:
// to turn an object into NSData
return [NSKeyedArchiver archivedDataWithRootObject:o];
// To turn NSData into your object again
return [NSKeyedUnarchiver unarchiveObjectWithData:data];
Не связан с StackOverflow