swift 已弃用NSKeyedUnarchiver.unarchiveTopLevelObjectWithData

7xzttuei  于 2023-04-19  发布在  Swift
关注(0)|答案(2)|浏览(208)

我在尝试修复已弃用的方法时遇到了一些问题。在弃用之前,我保存了我的CustomClass数组,如下所示:

data =  try NSKeyedArchiver.archivedData(withRootObject: tabCustomObj, requiringSecureCoding: true)

然后我恢复数据与:

try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? [CustomClass]

从非弃用的方法中,我使用以下方法:

try NSKeyedUnarchiver.unarchivedArrayOfObjects(ofClass: CustomClass.self, from: data)

对我来说,它与new方法是等效的,但它看起来失败了,它只适用于一个对象。现在,所以我不反对我的代码,但对于未来,它将是问题,如果有人有同样的问题(或我错过了什么)?

kq0g1dla

kq0g1dla1#

CustomClass符合NSObject and NSSecureCoding时,如示例代码所示,解码对我有效。
下面是我的测试代码,它使用原始的NSKeyedUnarchiver.unarchivedArrayOfObjects(ofClass:...)来恢复[CustomClass]数组。

let arr = [CustomClass(name: "name1"), CustomClass(name: "name2")]

do {
   let data = try NSKeyedArchiver.archivedData(withRootObject: arr, requiringSecureCoding: true)
   
   let decodeArray = try NSKeyedUnarchiver.unarchivedArrayOfObjects(ofClass: CustomClass.self, from: data)

   decodeArray?.forEach{ print("---> item: \($0.name)") }
   
} catch {
   print("\n---> error: \(error)\n")
}

class CustomClass: NSObject, NSSecureCoding {
    
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    static var supportsSecureCoding: Bool = true

    func encode(with coder: NSCoder) {
        coder.encode(name, forKey: "name")
    }

    required init?(coder: NSCoder) {
        name = coder.decodeObject(forKey: "name") as! String
    }
    
}

注意,它也适用于

let decodeArray = try NSKeyedUnarchiver.unarchivedArrayOfObjects(ofClasses: [CustomClass.self], from: data) as? [CustomClass]
qxsslcnc

qxsslcnc2#

感谢您的反馈,通过比较工作示例,这是一个完全类似的情况.我终于找到了问题,我解码我的CustolmClass中包含NSValue数组的属性,我正在解码它使用:

myTab = coder.decodeObject(forKey:"keytab") as? [NSValue]

当MyCustomClass使用不推荐使用的方法时,它可以工作,当使用非不推荐使用的方法解码CustomClass对象的表格时,它会失败。当使用新版本解码我的CustomClass中的myTab时,它修复了这个问题:

myTab = coder.decodeArrayOfObjects(ofClass: NSValue.self,
                                     forKey: "keytab")

多亏了工作基地的例子,它让我走上了正确的轨道来识别问题!

相关问题