unarchiveObjectwithFile已弃用

问题描述

我一直在学习本教程: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
    }
}