Ste*_*ton 8 exception objective-c swift
在使用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"];
Run Code Online (Sandbox Code Playgroud)
数组中的值是NSStrings和NSDate.
在MMWormhole的内容中你会得到:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:messageObject];
Run Code Online (Sandbox Code Playgroud)
messageObject只是书签数组,没有任何中间处理.
在扩展我有:
let wormhole = MMWormhole(applicationGroupIdentifier: "group.XX", optionalDirectory:nil)
let bookmarks = wormhole.messageWithIdentifier("XXX") as? Array<Dictionary<String,AnyObject>>
Run Code Online (Sandbox Code Playgroud)
messageWithIdentifier:最终调用它:
id messageObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Run Code Online (Sandbox Code Playgroud)
数组被正确写出到app组文件夹 - 我可以使用另一个扩展名读取它,一个用Objective C编写.
我在模拟器中运行时会出现此异常.在32位设备(iPhone 5和iPad 3)上运行时,代码似乎可以正常工作.我目前没有要测试的64位设备.
我想我错过了一个import或一个框架,但是哪一个?
这只是一个侧面说明:
您可以为NSKeyedArchiver&设置类名NSKeyedUnarchiver.我没有处理CoreData就遇到了这个问题.unarchiver再也找不到我自己的课了.
设置className我的课程如下所示:
对于archiver:
NSKeyedArchiver.setClassName("MyClass", for: MyClass.self)
let data = NSKeyedArchiver.archivedData(withRootObject: root)
Run Code Online (Sandbox Code Playgroud)
而且unarchiver:
NSKeyedUnarchiver.setClass(MyClass.self, forClassName: "MyClass")
let root = NSKeyedUnarchiver.unarchiveObject(with: data)
Run Code Online (Sandbox Code Playgroud)
我在 Apple 开发者论坛上提出了这个问题,并且(这一次)从 Apple 开发者关系部门得到了很好的答案。我将引用重要的部分:
\n\n\n\n\nNSKnownKeysDictionary1 是一个我不明白的核心数据巫毒。\n ...显然它的序列化和\n 反序列化出了问题。您是否已在虫洞两端启动并运行核心数据?无论如何,对书签数组(以及从核心数据返回的任何其他内容)进行深度复制可能更有意义,以便您可以通过 \xe2\x80\xe2\x80\x99 发送标准字典x98wire\xe2\x80\x99\n 而不是核心数据的东西。
\n
所以我的解决方案是要么将Core Data框架添加到扩展中,要么进行深复制。(我暂时做了前者。正确的解决方案可能是后者。)
\n