A chave não é encontrada em um objeto NSKeyedUnarchiver
-
12-12-2019 - |
Pergunta
Eu geralmente codificar os meus dados em um NSFileWrapper
como este (eu deixar de fora o NSFileWrapper bits):
-(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;
}
}
E eu costumo ter a minha dados de volta ao fazer isso:
- (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"];
}
Às vezes, eu pego NSData
de volta (não é nada), mas [unarchiver decodeObjectForKey:@"data"]
retornará NIL.Ele aparece como se não há nenhum objeto para a chave @"dados" mesmo que deve ser.Eu acho que algo deve ter saído errado quando a codificação, mas eu não tenho certeza de como resolver problemas deste.Posso tomar apenas o que está no data
e codificá-lo, sem se preocupar se ele tem a chave certa?Quero dizer, não deve apenas ser uma tecla de "dados".
Solução
Qual é o seu código de tão complicado :) O NSKeyedArchiver
classe possui métodos auxiliares que vai fazer o que você quer, mais simplesmente :
// to turn an object into NSData
return [NSKeyedArchiver archivedDataWithRootObject:o];
// To turn NSData into your object again
return [NSKeyedUnarchiver unarchiveObjectWithData:data];