如何将已弃用的函数 NSKeyedUnarchiver.unarchiveObject(with:) 更改为 unarchivedObjectOfClass:fromData:error:

How to change the deprecated function NSKeyedUnarchiver.unarchiveObject(with:) to unarchivedObjectOfClass:fromData:error:

提问人:RP89 提问时间:3/9/2023 更新时间:3/9/2023 访问量:257

问:

在我的应用程序中,登录后获取的用户数据保存在首选项中,如下所示。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 对象的数据。如何在不影响现有应用用户的情况下更改此现有实现?

ios swift 弃用警告 nskeyedunarchiver

评论


答:

1赞 Mickael Belhassen 3/9/2023 #1

将函数替换为:

try? NSKeyedUnarchiver.unarchivedObject(ofClass: NSData.self, from: data) as? Data
1赞 vadian 3/9/2023 #2

您将存档已经符合 PropertyList 的存档。移除东西。DataNSKeyed(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
仅当您有符合 的对象(类)时。然而,现在只要有可能,就更喜欢。NSObjectNSCodingCodable
0赞 RP89 3/9/2023
这里 LoginModel 类是 Codable,但错误的部分是转换为 Data,并使用 NSKeyedArchiver 保存到首选项。我说得对吗?由于该应用程序被大量用户使用,并且每次启动时都会访问此 userData,因此如果我更改和更新应用程序,是否会影响应用程序?这是几年前开发的。
0赞 vadian 3/9/2023
再一次,您可以直接保存到。无需存档。DataUserDefaults