gpt4 book ai didi

ios - 未存档对象数据时面临的问题

转载 作者:行者123 更新时间:2023-12-01 21:57:56 25 4
gpt4 key购买 nike

我已经为generic functionNSKeyedArchiver创建了NSKeyedUnarchiver。我能够存档数组数据,但是在进行非存档操作时会遇到问题。下面是我的代码:

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代码= 4864“键'customclass1'的值为
意外的类'CustomClass1'。允许的类别为'{(
NSArray,
MainClass)}'。” UserInfo = {NSDebugDescription =键'customclass2'的值是意外类'CustomClass2'。允许的类是
'{(
NSArray,
MainClass)}'。}

任何想法如何解决这个问题?

最佳答案

确保所有 class 都在向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
}
}

关于ios - 未存档对象数据时面临的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61074347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com