【问题标题】:How to unarchive custom object to something other than custom class in Swift如何将自定义对象取消归档到 Swift 中的自定义类以外的其他内容
【发布时间】:2018-12-12 06:00:43
【问题描述】:

我有一个对象,我们使用 NSKeyedArchiver 归档为类 Foo

然后我将目标名称从Apple 更改为Orange。它投入生产,用户在启动时开始崩溃。但不是所有的。并且日志指向NSKeyedUnarchiver

我从目标被称为Apple 和当它被称为Orange 并转换为xml 时抓取了存档的Foo 文件,以便我可以阅读它。主要和唯一的区别(我认为)是classname 键分别是Apple.FooOrange.Foo

如何获取其中一个存档文件并检查它的存档类名?

如果我这样做NSKeyedUnarchiver.unarchiveObject(withFile: path) as? Foo,它会崩溃。

理想情况下我会这样:

let object = NSKeyedUnarchiver.unarchiveObject(withFile: path) as? [String : Any] 
let name = object!["classname"]!
if name == "Apple.Foo" {
    //delete the cache and let it rebuild
}

但显然它不是这样工作的。关于如何检查我是否有损坏的文件并将其删除而不导致应用崩溃的任何想法?

感谢您的帮助!

【问题讨论】:

  • 我会保留这两个类,尝试一个未归档的两个类,然后从另一个类开始创建,然后决定每次保存同一个类?
  • @Larme 问题是它们不是不同的类,它们是相同的。但是该类使用一个目标名称存档,并且未存档为不同的目标名称。所以类名的前缀是不同的。但它只会让一部分用户崩溃。

标签: ios swift nskeyedunarchiver


【解决方案1】:

在过去的几天里,我了解到您可以同时为 unarchiver 设置两个不同的类名,它们都可以工作:

NSKeyedUnarchiver.setClass(Foo.classForKeyedUnarchiver(), forClassName: "Apple.Foo")
NSKeyedUnarchiver.setClass(Foo.classForKeyedUnarchiver(), forClassName: "Orange.Foo")

现在,在取消归档时文件实际具有的类名并不重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多