在使用Swift尝试取消归档时,我遇到以下异常:
由于未捕获的异常'NSInvalidUnarchiveOperationException'终止应用程序,原因:'*** - [NSKeyedUnarchiver decodeObjectForKey:]:无法解码类的对象(NSKnownKeysDictionary1)以获取密钥(NS.objects);该类可以在源代码中定义,也可以在未链接的库中定义
上下文:我正在创建一个“共享链接”扩展。在我的主应用程序(用Objective C编写)中,我使用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"];
数组中的值是NSStrings和NSDate。
在MMWormhole的内容中你会得到:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:messageObject];
messageObject只是书签数组,没有任何中间处理。
在扩展程序中我有:
let wormhole = MMWormhole(applicationGroupIdentifier: "group.XX", optionalDirectory:nil)
let bookmarks = wormhole.messageWithIdentifier("XXX") as? Array<Dictionary<String,AnyObject>>
messageWithIdentifier:最终最终调用它:
id messageObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
数组被正确写出到app组文件夹 - 我可以使用另一个扩展名读取它,一个用Objective C编写。
当我在模拟器中运行时,会出现此异常。代码出现,以便在32位设备(iPhone 5和iPad 3)上运行时正常工作。我目前没有要测试的64位设备。
我想我错过了import
或框架,但是哪一个?
答案 0 :(得分:6)
这只是旁注:
您可以为NSKeyedArchiver
和&amp; NSKeyedUnarchiver
。
我没有处理CoreData就遇到了这个问题。 unarchiver再也找不到我自己的课了。
为我的班级设置className
如下所示:
对于archiver
:
NSKeyedArchiver.setClassName("MyClass", for: MyClass.self)
let data = NSKeyedArchiver.archivedData(withRootObject: root)
unarchiver
:
NSKeyedUnarchiver.setClass(MyClass.self, forClassName: "MyClass")
let root = NSKeyedUnarchiver.unarchiveObject(with: data)
答案 1 :(得分:2)
我在Apple开发者论坛上和Apple Developer Relations的got a good answer问过这个问题。我会引用一些重要的内容:
NSKnownKeysDictionary1是我不明白的核心数据伏都教。 ......显然,它的序列化和问题出了问题 deserialisation。你有两个核心数据正在运行吗? 虫洞?无论如何,进行深层复制可能更有意义 您的书签数组(以及您从Core获得的任何其他内容) 数据)这样你就可以在'wire'上发送标准词典 而不是核心数据。
所以我的解决方案是将Core Data框架添加到扩展程序或执行深层复制。 (我暂时完成了前者。适当的解决方案可能就是后者。)