Chiave non trovata in un oggetto NskeyedunArchiver
-
12-12-2019 - |
Domanda
Di solito codificando i miei dati in un NSFileWrapper
come questo (lascio fuori il bit 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;
}
}
.
e di solito ottengo i miei dati quando fai questo:
- (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 volte, ottengo NSData
Back (non è NIL), ma [unarchiver decodeObjectForKey:@"data"]
restituirà NIL.Sembra che non ci sia alcun oggetto per la chiave @ "dati" anche se dovrebbe esserci.Immagino che qualcosa debba essere andato storto quando si codifica, ma non sono sicuro di come disturbare sparare questo.Posso semplicemente prendere qualsiasi cosa sia in data
e codificarlo, non preoccuparti se ha la chiave giusta?Voglio dire che ci dovrebbero mai essere solo un tasto "dati".
Soluzione
Perché il tuo codice è così complicato :) La classe NSKeyedArchiver
ha metodi Helper che farà ciò che vuoi più semplicemente:
// to turn an object into NSData
return [NSKeyedArchiver archivedDataWithRootObject:o];
// To turn NSData into your object again
return [NSKeyedUnarchiver unarchiveObjectWithData:data];
.