iOS编辑器错误。已重命名archivedData

Neg*_*ity 5 nskeyedarchiver ios swift

请帮我!我陷入了困境,找不到出路。我正在尝试学习IOS编程工作,所以我想我将从他们的教程应用“ Meal list”应用开始。我现在应该开始保存持久性数据,现在编辑器使我陷入了永无休止的循环。我有一行代码...

let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(meals, toFile: Meal.ArchiveURL.path)
Run Code Online (Sandbox Code Playgroud)

那给了我一个警告,说...

在iOS 12.0中不推荐使用'archiveRootObject(_:toFile :)':使用+ archivedDataWithRootObject:requiringSecureCoding:error:代替

好的,所以我将代码行更改为...

let isSuccessfulSave = NSKeyedArchiver.archivedDataWithRootObject(meals)
Run Code Online (Sandbox Code Playgroud)

然后给我警告...

'archivedDataWithRootObject'已重命名为'archivedData(withRootObject :)'

好的,所以我将代码行更改为...

let isSuccessfulSave = NSKeyedArchiver.archivedData(withRootObject: meals)
Run Code Online (Sandbox Code Playgroud)

告诉我...

在iOS 12.0中不推荐使用'archivedData(withRootObject :)':使用+ archivedDataWithRootObject:requiringSecureCoding:error:代替

好的...所以...不建议使用archivedData,而我必须使用archivedDataWithRootObject,但是使用archivedDataWithRootObject已重命名为archivedData,但是不建议使用archivedData,所以请使用archivedDataWithRootObject,将其重命名为archivedData,不建议使用... ad infinitum。

我试过看开发人员文档,但是他们只是告诉我同样的事情,一个已经过时,没有链接或任何东西,搜索google只是给了我一堆页面,向我展示了使用其中任何一个的语法。我仍然对IOS编程真的很陌生,不知道如何摆脱这种无休止的循环,从重命名到重命名到...

请帮助,我迷路了,不确定如何继续。谢谢。

小智 13

我正在按照您尝试执行的相同示例进行操作,并且发现了如何更新iOS 12中用于存储和检索值的方法,这将对您有所帮助:

//MARK: Private Methods
private func saveMeals() {

    let fullPath = getDocumentsDirectory().appendingPathComponent("meals")

    do {
        let data = try NSKeyedArchiver.archivedData(withRootObject: meals, requiringSecureCoding: false)
        try data.write(to: fullPath)
        os_log("Meals successfully saved.", log: OSLog.default, type: .debug)
    } catch {
        os_log("Failed to save meals...", log: OSLog.default, type: .error)
    }
}

func getDocumentsDirectory() -> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    return paths[0]
}

private func loadMeals() -> [Meal]? {
    let fullPath = getDocumentsDirectory().appendingPathComponent("meals")
    if let nsData = NSData(contentsOf: fullPath) {
        do {

            let data = Data(referencing:nsData)

            if let loadedMeals = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? Array<Meal> {
                return loadedMeals
            }
        } catch {
            print("Couldn't read file.")
            return nil
        }
    }
    return nil
}
Run Code Online (Sandbox Code Playgroud)

另外,您还将发现需要按以下方式更新ViewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

    // Use the edit button item provided by the table view controller.
    navigationItem.leftBarButtonItem = editButtonItem

    let savedMeals = loadMeals()

    if savedMeals?.count ?? 0 > 0 {
        meals = savedMeals ?? [Meal]()
    } else {
        loadSampleMeals()
    }

}
Run Code Online (Sandbox Code Playgroud)

我希望这会有所帮助,对我而言,该应用程序现在可以运行,存储和检索数据。

仅供参考:这不适用于Xcode 11 beta,并且iOS 13应该适用于那些版本之前的任何版本。


小智 5

iOS 12 的通用解决方案是:

class SettingsArchiver {
    static func setData(_ value: Any, key: String) {
        let ud = UserDefaults.standard
        let archivedPool = try? NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: true)
        ud.set(archivedPool, forKey: key)
    }

    static func getData<T>(key: String) -> T? {
        let ud = UserDefaults.standard
        if let val = ud.value(forKey: key) as? Data,
            let obj = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(val) as? T {
            return obj
        }
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)