ios - unarchivedObject 数据时面临的问题
问题描述
我创建了一个generic function
forNSKeyedArchiver
和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
}
上面的代码适用于只有strings
,integers
变量,但如果有custom classes
变量则失败。如何在NSKeyedUnarchiver
.
我收到以下错误:
解码数组缓存数据时出现异常错误域 = NSCocoaErrorDomain 代码 = 4864“键 'customclass1' 的值属于意外类 'CustomClass1'。允许的类是 '{( NSArray, MainClass )}'。” UserInfo={NSDebugDescription=key 'customclass2' 的值属于意外类 'CustomClass2'。允许的类是 '{( NSArray, MainClass )}'。}
知道如何解决这个问题吗?
解决方案
确保你所有的班级都在确认 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
}
}
推荐阅读
- html - Font-Awesome CSS 文件不工作,但 Font-Awesome CDN 工作。为什么?
- azure-devops - 检查工作人员是自托管的还是 Azure 运营的
- java - 如何修复测试依赖项中的拆分包?
- java - 使用 openjfx 插件时,Gradle 不会在 Mac 上的 Eclipse 中构建 Java 路径
- azure-devops - 在 Azure Devops 中创建角色用户后将 AzureAD 链接到组织域的影响
- javascript - 在酶中模拟焦点不会改变 document.activeElement
- javascript - 如何实现计数缺失括号?
- node.js - 使用nodejs将数据库(sql server)中的数据保存到全局变量中
- java - 仅当模型存在时才更新 JPA
- awk - 提取第二对引号之间的值