如何NSKeyedUnarchiver.unarchiveObject

时间:2019-05-04 11:54:47

标签: swift ios12 nskeyedunarchiver

我有一个有效的工作代码,但已弃用:

这部分很好:

 let archived = try? NSKeyedArchiver.archivedData(withRootObject: [defaultRecord] as NSArray, requiringSecureCoding: false)

已弃用:

 let records = NSKeyedUnarchiver.unarchiveObject(with: unarchivedObject as Data) as? [Record]
  

'unarchiveObject(with :)'在iOS 12.0中已被弃用:使用   + unarchivedObjectOfClass:fromData:error:代替

听起来很简单,我无法找到一种方法来使用建议的方法,而不会在尝试的每种组合中出现错误。

有什么可行的例子吗?

2 个答案:

答案 0 :(得分:1)

使用新API归档数组有点棘手。

如果您不会忽略try?的错误

要使用unarchivedObject(ofClass:from:解码自定义类的数组,必须使用 plural 形式unarchivedObject(ofClasses:from:并同时指定两个NSArray(!)和自定义类。此外,您的班级必须采用NSSecureCoding

class Record : NSObject, NSSecureCoding {

   static var supportsSecureCoding: Bool {
        return true
    }

....

do {
    let archived = try NSKeyedArchiver.archivedData(withRootObject: [defaultRecord], requiringSecureCoding: false)

    let records = try NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSArray.self, Record.self], from: archived) as! [Record]
    print(records)
} catch { print(error) }

但是为什么将defaultRecord归档为数组呢?如果您归档单个对象,则可以按原样保留类并编写

do {
    let archived = try NSKeyedArchiver.archivedData(withRootObject: defaultRecord, requiringSecureCoding: false)

    let record = try NSKeyedUnarchiver.unarchivedObject(ofClass: Record.self, from: archived)
    let records = [record]
    print(records)
} catch { print(error) }

旁注:考虑使用Codable序列化该类。它是 swiftier ,不需要从NSObject继承。

答案 1 :(得分:0)

上面的方法不适用于我进行归档,我做到了,而且有效:

NSKeyedUnarchiver.unarchivedObject(ofClasses: [Record.self], from: archived)