web-dev-qa-db-ja.com

Swift 3の場合、UserDefaultsは保存されません。

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を使用しています)。フラグはアプリのライフサイクル中に正しい値を維持しますが、閉じると、その値はおそらく何らかの方法で削除されます。

13

私は同じ問題を抱えていて、問題は「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")
                }

        }
    }

誰かが説明できるなら、なぜそれがメインスレッドで機能し他には機能しないのか、私はそれを聞いてうれしいです。

20
Vojtech Kubat

このように、

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()
    }
}
2
Venk

変えようとする

UserDefaults.standard.set(isOffline, forKey: "isOffline")

UserDefaults.standard.setValue(isOffline, forKey: "isOffline")

ディスパッチコードなし

1
Omar N Shamali