【问题标题】:Facing issue while unarchivedObject dataunarchivedObject 数据时面临的问题
【发布时间】:2020-04-07 06:53:33
【问题描述】:

我为NSKeyedArchiverNSKeyedUnarchiver 创建了一个generic function。我能够存档阵列数据,但在进行取消存档时会遇到问题。以下是我的代码:

NSKeyedArchiver 代码:

func cacheData<T>(data: T) {        
        do {
            let codedData = try NSKeyedArchiver.archivedData(withRootObject: data, requiringSecureCoding: false)
        } catch {
            print("Exception while caching data \(error)")
        }
    }

NSKeyedUnarchiver 代码:

func getCacheData<T>(encodedData: Data, ofClass: T.Type) -> [T]? {
    do{
        if let decodedData = try NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSArray.self, T.self as! AnyClass], from: encodedData){
            return decodedData as? [T]
        }
    } catch {
        print("Exception while decode array cache data \(error)")
    }
    return nil
}

上面的代码适用于只有stringsintegers 变量,但如果有custom classes 变量则失败。如何在NSKeyedUnarchiver 中允许这些自定义类。

我遇到以下错误:

解码数组缓存数据时出现异常错误 Domain=NSCocoaErrorDomain Code=4864 "key 'customclass1' 的值是 意外的类“CustomClass1”。允许的类是 '{( NSArray, MainClass )}'。" UserInfo={NSDebugDescription=key 'customclass2' 的值是意外的类 'CustomClass2'。允许的类是 '{( NSArray, MainClass )}'.}

知道如何解决这个问题吗?

【问题讨论】:

标签: ios arrays swift nskeyedarchiver nskeyedunarchiver


【解决方案1】:

确保您的所有班级都确认 NSCoding。像这样的:

func archiveAndUnarchive() {
let class2 = Class2(value: "Value")
let class1 = Class1(name: "Name", class2: class2)
do {
    // ARCHIVING
    let data = try NSKeyedArchiver.archivedData(withRootObject: class1, requiringSecureCoding: false)

    // UNARCHIVING
    if let decodedData = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? Class1 {
        print(decodedData)
    }
} catch {
    print(error)
}
}

class Class1: NSObject, NSCoding {
var name: String?
var class2: Class2?

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

required init?(coder: NSCoder) {
    super.init()
    self.name = coder.decodeObject(forKey: "name") as? String ?? ""
    self.class2 = coder.decodeObject(forKey: "class2") as? Class2
}

init(name: String, class2: Class2) {
    super.init()
    self.name = name
    self.class2 = class2
}
}


class Class2: NSObject, NSCoding {
var value: String?

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

required init?(coder: NSCoder) {
    super.init()
    self.value = coder.decodeObject(forKey: "value") as? String
}

init(value: String) {
    super.init()
    self.value = value
}
}

【讨论】:

  • @vadian 你能检查一下这是否能解决你的问题吗?如果没有,请告诉我,也让我知道它在哪里坏了,以便我解决它
猜你喜欢
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多