导入为框架后,NSKeyedUnarchiver decodeObjectForKey崩溃

7ba*_*all 1 core-data nscoding nscoder ios cocoapods

MyClass进入框架之前,我可以将实例保存MyClass到Core Data中.

这是实施MyClass:

open class MyClass: NSObject, NSCoding {
  required public init?(coder aDecoder: NSCoder) {
        super.init()
        stuffs = aDecoder.decodeObject(forKey: "stuff") as? [Stuff] ?? []
    }

    open func encode(with aCoder: NSCoder) {
        aCoder.encode(stuffs, forKey: "stuffs")
    }
}
Run Code Online (Sandbox Code Playgroud)

MyClass使用CocoaPods进入框架后,我开始遇到这些崩溃:

CoreData: error: exception handling request: <NSSQLFetchRequestContext: 0x1c019d4d0> , *** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (MyClass) for key (NS.objects); the class may be defined in source code or a library that is not linked with userInfo of {
    "__NSCoderInternalErrorCode" = 4864;
}
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?...

Tom*_*ton 7

通过将此类移动到框架中,您已经更改了它的全名.在此之前会有类似的东西,MyApp.MyClass但现在却是MyFramework.MyClass.密钥存档并不知道它们是相同的,这就是导致问题的原因.删除和重新安装让您解决了问题,因为不再有任何旧数据需要解码.

您可以通过使用setClass(:forClassName:)告诉unarchive进程如何解决冲突,以便控制类/名称匹配.你会做类似的事情

NSKeyedUnarchiver.setClass(MyClass.self, forClassName: "MyApp.MyClass")
Run Code Online (Sandbox Code Playgroud)

这将解决解码问题.为了保持往返编码/解码工作,您可能需要为归档做同样的事情,例如

NSKeyedArchiver.setClassName("MyApp.MyClass", for: MyClass.self)
Run Code Online (Sandbox Code Playgroud)