gpt4 book ai didi

swift - 使用 NSKeyedUnarchiver 取消存档时捕获异常

转载 作者:行者123 更新时间:2023-12-02 04:33:55 24 4
gpt4 key购买 nike

我们有一个 Swift 类,它继承自 NSObject 并实现了 NSCoding。我们需要更改代码中类的名称 磁盘上的存档。幸运的是,我们不需要保留数据。删除缓存文件并返回默认数据就可以了。问题在于检测它何时失败并适本地处理它。

好的,开始时数据是这样写的(忽略强制展开的自由等。这只是为了让问题简洁):

let someObject: [Int: MyClass] = ...
let data = NSKeyedArchiver.archivedData(withRootObject: someObject)
try! data.write(to: someUrl, options: .atomic)

这很好用。我们现有的解码方法是这样的(同样,我们的代码在实践中更安全):

let someObject = NSKeyedUnarchiver.unarchiveObject(withFile: someUrl.path)! as! [Int: MyClass]

现在,当我们重命名我们的类时,我们将不得不处理解码失败的情况。使用 NSKeyedUnarchiver,您可以设置一个委托(delegate),如果解码失败,该委托(delegate)将调用一个方法。在更改它之前,我想重新编写我们现有的解码器以确保它可以在我进行任何更改之前按原样解码。不幸的是,它不能。这是我们得到的:

let fileData = fileManager.contents(atPath: fileUrl.path)!
let unarchiver = NSKeyedUnarchiver(forReadingWith: fileData)
guard let myObject = try! unarchiver.decodeTopLevelObject() as? [Int: MyClass] else {
return [Int: MyClass]()
}

现在,我没想到会有任何问题。然而,对 decodetopLevelObject() 的调用每次都会失败,只是返回 nil(这绝对不是问题所在)。我不知道为什么。这方面的文档实际上是不存在的。有一个类似的调用是 decodeObject(),但它也没有明显的原因失败。我试过设置委托(delegate)并实现该方法,但它从未被调用。

我们哪里错了?

最佳答案

尝试将 decodeObject(forKey:)NSKeyedArchiveRootObjectKey 或类似的 API 一起使用。

关于swift - 使用 NSKeyedUnarchiver 取消存档时捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45634131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com