提问人:RP89 提问时间:3/9/2023 更新时间:3/9/2023 访问量:257
如何将已弃用的函数 NSKeyedUnarchiver.unarchiveObject(with:) 更改为 unarchivedObjectOfClass:fromData:error:
How to change the deprecated function NSKeyedUnarchiver.unarchiveObject(with:) to unarchivedObjectOfClass:fromData:error:
问:
在我的应用程序中,登录后获取的用户数据保存在首选项中,如下所示。xcode 显示警告,指出 NSKeyedUnarchiver.unarchiveObject(with:) 和 NSKeyedArchiver.archivedData(withRootObject:) 已从 iOS 12 中弃用。但是在最新的iOS版本之前,应用程序运行良好。为了使其稳定,如何将其更改为unarchivedObjectOfClass:fromData:error:,这是推荐的。
static var userLoginResponse : LoginModel? {
get {
if let data = UserDefaults.standard.data(forKey: "userLoginResponse"), let respData = NSKeyedUnarchiver.unarchiveObject(with: data) as? Data {
return LoginModel(data: respData)
}
return nil
}
set {
if let value = newValue?.toJsonData() {
UserDefaults.standard.setValue(NSKeyedArchiver.archivedData(withRootObject: value), forKey: "userLoginResponse")
} else {
UserDefaults.standard.setValue(nil, forKey: "userLoginResponse")
}
}
}
根据 apple 文档,unarchivedObjectOfClass:fromData:error: 将取消存档保存为 NSCoded 对象的数据。如何在不影响现有应用用户的情况下更改此现有实现?
答:
1赞
Mickael Belhassen
3/9/2023
#1
将函数替换为:
try? NSKeyedUnarchiver.unarchivedObject(ofClass: NSData.self, from: data) as? Data
1赞
vadian
3/9/2023
#2
您将存档已经符合 PropertyList 的存档。移除东西。Data
NSKeyed(Un)archiver
static var userLoginResponse : LoginModel? {
get {
guard let data = UserDefaults.standard.data(forKey: "userLoginResponse") else { return nil }
return LoginModel(data: data)
}
set {
UserDefaults.standard.set(newValue?.toJsonData(), forKey: "userLoginResponse")
}
}
旁注:除非您指的是 KVC(您不是)。setValue(_:forKey:)
评论
0赞
RP89
3/9/2023
这意味着我们使用 NSKeyed(Un)archiver 如果要将对象保存为这样的对象,对吗?
0赞
vadian
3/9/2023
仅当您有符合 的对象(类)时。然而,现在只要有可能,就更喜欢。NSObject
NSCoding
Codable
0赞
RP89
3/9/2023
这里 LoginModel 类是 Codable,但错误的部分是转换为 Data,并使用 NSKeyedArchiver 保存到首选项。我说得对吗?由于该应用程序被大量用户使用,并且每次启动时都会访问此 userData,因此如果我更改和更新应用程序,是否会影响应用程序?这是几年前开发的。
0赞
vadian
3/9/2023
再一次,您可以直接保存到。无需存档。Data
UserDefaults
评论