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)
| 归档时间: |
|
| 查看次数: |
3584 次 |
| 最近记录: |