sto ottenendo la seguente eccezione quando si tenta di estrarre dall'archivio quando si utilizza Swift:NSKeyedUnarchiver non può decodificare oggetto della classe NSKnownKeysDictionary1
terminazione app a causa di eccezione non identificata 'NSInvalidUnarchiveOperationException', la ragione: '*** - [NSKeyedUnarchiver decodeObjectForKey:]: impossibile decodificare l'oggetto della classe (NSKnownKeysDictionary1) per la chiave (NS.objects); la classe può essere definita nel codice sorgente o in una libreria non collegata '
Contesto: sto creando un'estensione "Condividi collegamenti". Nella mia app principale (scritta nell'Obiettivo C) scrivo una serie di dizionari con le informazioni sui collegamenti usando MMWormhole.
NSFetchRequest* bookmarkFetch = [NSFetchRequest fetchRequestWithEntityName:@"XX"];
bookmarkFetch.propertiesToFetch = @[
@"name", @"text", @"date", @"url"
];
bookmarkFetch.resultType = NSDictionaryResultType;
NSArray* bookmarks = [moc executeFetchRequest:bookmarkFetch error:NULL];
[wormhole passMessageObject:bookmarks identifier:@"XXX"];
I valori nell'array sono NSStrings e NSDate.
Nelle viscere della MMWormhole si ottiene:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:messageObject];
messageObject è solo la matrice preferiti senza alcuna elaborazione intermedia.
Nel estensione ho:
let wormhole = MMWormhole(applicationGroupIdentifier: "group.XX", optionalDirectory:nil)
let bookmarks = wormhole.messageWithIdentifier("XXX") as? Array<Dictionary<String,AnyObject>>
messageWithIdentifier: finisce in ultima analisi, la chiamata a questo:
id messageObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
La matrice viene scritto nella cartella di gruppo applicazione in modo corretto - posso leggerlo usando un'altra estensione, una scritta nell'obiettivo C.
Questa eccezione viene visualizzata quando eseguo il simulatore. Il codice appare per funzionare correttamente quando viene eseguito su un dispositivo a 32 bit (iPhone 5 e iPad 3). Non ho un dispositivo a 64 bit per testare al momento.
Immagino di perdere uno import
o un framework, ma quale/i?
Qual è il formato di 'data' al viene chiamato 'NSKetedUnarchiver'? È possibile che i valori o la struttura della classe siano cambiati in codice da quando sono stati salvati per la prima volta nel filesystem? La pulizia di dati/cache derivati potrebbe dirti se questo è il problema. – ColinMasters
Passa semplicemente l'NSArray 'bookmarks' direttamente a NSKeyedArchiver. Ho aggiornato la mia domanda con quel codice. –