【发布时间】:2018-07-13 00:26:29
【问题描述】:
我的应用使用自定义类作为其数据模型:
class Drug: NSObject, NSCoding {
// Properties, methods etc...
}
我刚刚创建了一个 Today 扩展,需要从中访问用户的数据,所以我使用 NSCoding 将我的数据保存在应用容器和共享容器中。这些是主应用程序中的保存和加载功能:
func saveDrugs() {
// Save to app container
let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(drugs, toFile: Drug.ArchiveURL.path)
if isSuccessfulSave {
print("Drugs successfully saved locally")
} else {
print("Error saving drugs locally")
}
// Save to shared container for extension
let isSuccessfulSaveToSharedContainer = NSKeyedArchiver.archiveRootObject(drugs, toFile: Drug.SharedArchiveURL.path)
if isSuccessfulSaveToSharedContainer {
print("Drugs successfully saved to shared container")
} else {
print("Error saving drugs to shared container")
}
}
func loadDrugs() -> [Drug]? {
return NSKeyedUnarchiver.unarchiveObject(withFile: Drug.ArchiveURL.path) as? [Drug]
}
我遇到了类命名空间问题,我的 Today 扩展中的 NSKeyedUnarchiver 无法正确解码对象,所以我使用了this answer 并在类定义前添加了@objc:
@objc(Drug)
class Drug: NSObject, NSCoding {
// Properties, methods etc...
}
这完美地解决了这个问题。但是,这将是我的应用程序的 1.3 版,这似乎破坏了预先存在的数据的取消归档过程(我认为它可能会这样)。
处理这种情况最好的方法是什么,好像我只是做了这个改变,新版本的应用程序会为现有用户崩溃!
我找不到任何其他答案,我不确定NSKeyedArchiver.setClass() 方法是否相关,也不确定在哪里使用它。
我们将不胜感激地接受任何帮助。谢谢。
【问题讨论】:
-
应用为什么会崩溃?
-
嗨@matt 它崩溃了,因为一旦我添加了@objc(Drug) 行,NSKeyedUnarchiver 就无法解码旧的 Drug 类 (myApp.Drug) - 该类现在变为 *.Drug,它可以工作在应用程序和扩展程序之间共享时,但不解码旧的用户数据。新用户就好了。
标签: ios swift ios-app-extension nskeyedarchiver nskeyedunarchiver