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). bitPattern:OpaquePointerを取るイニシャライザもあります。したがって、保存する前と読み取った後に、辞書の値を変換する必要があります (たとえば、 を使用)。Intlet opaquePointer = OpaquePointer(bitPattern: intBitPattern)compactMapValues

を使用すると、 と を必要とDictionary<String, Int>せずに、UserDefaults に直接保存できるはずです。NSKeyedArchiverNSKeyedUnarchiver


補足: ポインターは「長寿命」ではありません。したがって、UserDefaults への保存は、アプリの有効期間中のみ有効です。アプリを再起動すると、ポインターが無効になる場合があります。

于 2021-08-26T07:55:49.403 に答える