1

我正在使用 Xcode 12 和 Swift 5 环境来构建 iOS 应用程序。

我需要在视图消失之前(或在应用程序关闭之前)存储一个 OpaquePointer 类型变量(以下代码中的“self.loggers”),并在视图出现时(当应用程序运行时)检索它。我尝试使用 UserDefault 如下,

// Storing(In viewWillDisappear)
do {
            encodedData = try NSKeyedArchiver.archivedData(withRootObject: self.loggers, requiringSecureCoding: false)
            UserDefaults.standard.set(encodedData, forKey: "accelLoggerID")
        } catch {
            print("archiving error")
        }
...

// Retrieving(In viewDidLoad)
if let decodedData = UserDefaults.standard.object(forKey: "acceleration") as? Data {
            do {
                self.loggers = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(decodedData) as? [String:OpaquePointer] ?? [:]} catch {
                    print("unarchiving error")
                }
        } else {
            self.loggers = [:]
            print("No value in Userdefault. [viewDidLoad]")
        }

但是,NSKeyedArchiver 未能对此类类型进行编码。之后,我创建了一个包装变量的类。

class LoggerWrapper {
    var loggers: [String : OpaquePointer]
    init(loggerDic: [String : OpaquePointer]) {
        loggers = loggerDic
    }
}

并更改了我的代码

self.loggers = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(decodedData) as? LoggerWrapper ?? LoggerWrapper(loggerDic: [:])} catch {
                    print("unarchiving error")
                }

但是,这会在调用 NSKeyedArchiver.archivedData 时给出 SIGABRT。有没有办法在 UserDefaults 中存储 Opaquepointer 类型?如果没有,使用核心数据可以解决这个问题吗?

谢谢你。

4

1 回答 1

0

您可能需要将指针转换为IntbitPatterns。为此有一个初始化Int程序:let intBitPattern = Int(bitPattern: opaquePointer). 还有一个OpaquePointer使用IntbitPattern:的初始化程序let opaquePointer = OpaquePointer(bitPattern: intBitPattern)。因此,您需要compactMapValues在存储之前和阅读之后转换字典中的值(例如使用)。

使用 a Dictionary<String, Int>,您应该能够将其直接存储在 UserDefaults 中,而无需使用NSKeyedArchiverand NSKeyedUnarchiver


旁注: 指针不是“长期存在的”。因此,将其存储在 UserDefaults 中仅在您的应用程序的生命周期内有效。一旦您的应用重新启动,指针可能不再有效。

于 2021-08-26T07:55:49.403 回答