UserDefaultsを使用してブール値を永続的に保存しようとしています。これは私のコードです:
public static var isOffline = UserDefaults.standard.bool(forKey: "isOffline") {
didSet {
print("Saving isOffline flag which is now \(isOffline)")
UserDefaults.standard.set(isOffline, forKey: "isOffline")
UserDefaults.standard.synchronize()
}
}
なぜ動かないのですか?このコードの問題は何ですか?
編集:問題は、UserDefaults
から"isOffline"
キーを取得しようとすると、常にfalse
を取得することです。
編集2:行の.onChangeメソッドでisOfflineを設定します(フォームを作成するためのフレームワークとしてEurekaを使用しています)。フラグはアプリのライフサイクル中に正しい値を維持しますが、閉じると、その値はおそらく何らかの方法で削除されます。
私は同じ問題を抱えていて、問題は「didSet」ブロック自体にありました。理由はわかりませんが、userDefaultsでは機能しません。適切に永続化されず、アプリケーションを強制終了した後、すべての変更が失われました。
Synchronize()は役に立ちません。私は、このメソッドが不要になり、将来は非推奨になることを発見しました(これはUserDefaultsクラスのコメントです):
-synchronizeは非推奨であり、将来のリリースではNS_DEPRECATEDマクロでマークされる予定です。
試行錯誤の結果、メインスレッドから呼び出すとうまくいくことがわかりました。
public static var isOffline = UserDefaults.standard.bool(forKey: "isOffline") {
didSet {
print("Saving isOffline flag which is now \(isOffline)")
DispatchQueue.main.async {
UserDefaults.standard.set(isOffline, forKey: "isOffline")
}
}
}
誰かが説明できるなら、なぜそれがメインスレッドで機能し他には機能しないのか、私はそれを聞いてうれしいです。
このように、
public static var isOffline:Bool {
get {
return UserDefaults.standard.bool(forKey: "isOffline")
}
set(newValue) {
print("Saving isOffline flag which is now \(isOffline)")
UserDefaults.standard.set(newValue, forKey: "isOffline")
UserDefaults.standard.synchronize()
}
}
変えようとする
UserDefaults.standard.set(isOffline, forKey: "isOffline")
に
UserDefaults.standard.setValue(isOffline, forKey: "isOffline")
ディスパッチコードなし