在 UserDefaults 中存储 OpaquePointer 类型

Posted

技术标签:

【中文标题】在 UserDefaults 中存储 OpaquePointer 类型【英文标题】:Storing OpaquePointer type in UserDefaults 【发布时间】:2021-08-26 07:33:59 【问题描述】:

我正在使用 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 类型?如果没有,使用核心数据可以解决这个问题吗?

谢谢。

【问题讨论】:

文档对OpaquePointer 有什么看法? 【参考方案1】:

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

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


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

【讨论】:

以上是关于在 UserDefaults 中存储 OpaquePointer 类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UserDefaults 中存储自定义对象?

在 UserDefaults 中存储字典

在 userdefaults 中存储背景图像

Swift 3.0:在 TableView 的 UserDefaults 中存储数组

如何将 UIView 存储在 CoreData 或 UserDefaults 中

在 UserDefaults 中存储 OpaquePointer 类型