La clave no se encuentra en un NSKeyedUnarchiver objeto
-
12-12-2019 - |
Pregunta
Me suelen codificar mis datos en un NSFileWrapper
como este (os dejo el 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;
}
}
Y yo solemos recuperar mis datos al hacer esto:
- (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"];
}
A veces, consigo NSData
la espalda (no es nil), pero [unarchiver decodeObjectForKey:@"data"]
se devuelve NIL.Parece como si no hay ningún objeto de la tecla @"datos" aunque no debería ser.Supongo que algo debe haber salido mal cuando la codificación, pero no estoy seguro de cómo atacar el problema este.¿Puedo tomar sólo lo que está en data
y codificarla, no preocuparse si no tiene la clave correcta?Me refiero no sólo debe siempre ser uno de los principales "datos".
Solución
¿Por qué es el código tan complicado :) El NSKeyedArchiver
la clase tiene métodos auxiliares que hace lo que usted desea más simplemente :
// to turn an object into NSData
return [NSKeyedArchiver archivedDataWithRootObject:o];
// To turn NSData into your object again
return [NSKeyedUnarchiver unarchiveObjectWithData:data];