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

标签 swift cocoa-touch nscoding nskeyedarchiver nskeyedunarchiver

我们有一个 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/

相关文章:

swift - DidSelectRowAtIndexPath 根本没有被调用

ios - 我需要一些帮助来归档 NSArray 以保存一些值并稍后添加/删除它们

image - 如何从相机胶卷保存/加载图像/视频

arrays - 扁平化 simd_float4x4 矩阵的优雅方式

swift - 具有 getter/setter 的变量在重写的存储属性上不能具有初始值

iphone - 边缘内填充颜色

ios - 应用程序激活时快速 View 重新加载

iphone - 将 UIImage 压缩到特定大小(以兆字节为单位)

ios - 导入为框架后,NSKeyedUnarchiver encodeObjectForKey崩溃

iphone - NSDictionary 或 NSKeyedArchiver