NSKeyedUnarchiver无法解码类NSKnownKeysDictionary1的对象

时间:2015-10-08 12:27:24

标签: objective-c swift exception

在使用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或框架,但是哪一个?

2 个答案:

答案 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框架添加到扩展程序或执行深层复制。 (我暂时完成了前者。适当的解决方案可能就是后者。)