问题描述
我一直在学习本教程:https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/PersistData.html,我知道它很旧,但是运行良好。
但是,我现在不赞成使用archiveRootObject(_:toFile:)
和unarchiveObject(withFile:)
的错误消息。
我遵循了一个答案,我认为我已经对archiveRootObject进行了排序,但是不知道如何执行unarchiveObject。
这是我更新的archiveRootObject代码:
do {
let saveData = try NSKeyedArchiver.archivedData(withRootObject: meals,requiringSecureCoding: true)
try saveData.write(to: Meal.ArchiveURL) }
catch { print(error) }
这是我原来的,现在已弃用的非归档代码:
private func loadMeals() -> [Meal]? {
return NSKeyedUnarchiver.unarchiveObject(withFile: Meal.ArchiveURL.path) as? [Meal] }
预先感谢
解决方法
在这种情况下,您的Meal
类应符合NSSecureCoding
协议(而不是NSCoding
)和子类NSObject
的要求:
class Meal: NSObject,NSSecureCoding {
static var supportsSecureCoding: Bool = true
required init?(coder: NSCoder) {}
func encode(with coder: NSCoder) {}
}
要取消存档Meal
的存储数组,可以使用unarchivedArrayOfObjects(ofClass:from:)
函数,如下所示:
private func loadMeals() -> [Meal]? {
do {
let data = try Data(contentsOf: Meal.ArchiveURL)
return try NSKeyedUnarchiver.unarchivedArrayOfObjects(ofClass: Meal.self,from: data)
}
catch {
print(error)
return nil
}
}