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)
知道为什么吗?...
通过将此类移动到框架中,您已经更改了它的全名.在此之前会有类似的东西,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)
| 归档时间: |
|
| 查看次数: |
699 次 |
| 最近记录: |