LoginSignup
2
2

More than 5 years have passed since last update.

UserDefaultsのラッパーのdeinitでsynchronizeを呼ぶべきではない

Last updated at Posted at 2015-07-16

UesrDefaultsのラッパーを作って、deinitでsyncronizeを呼んでいた所、データがきちんと反映されない事がありました。

UserDefaultWrapper.swift
class UserDefaultWrapper {
    private var store: [String: AnyObject]

    deinit {
        userDefaults.setObject(store, forKey: "store")
        userDefaults.synchronize()
    }
}

的な感じです。
使うときにはオブジェクトを開放するよう気をつけていて、反映されない時もきちんとdeinitは通っていました。
ところが何故かきちんとsynchronizeされていませんでした。
根本的には原因分かっていないですが、想像ではsynchronizeが完了する前にラッパーオブジェクトが解放されてしまっていたのではないかな?と思っています。

解決方法はこんな感じ。

UserDefaultWrapper.swift
class UserDefaultWrapper {
    private var store: [String: AnyObject]

    func set(key: String, data: AnyObject) {
        store[key] = data
        userDefaults.setObject(store, forKey: "store")
        userDefaults.synchronize()
    }
}

もうこれだったらいったんstoreとかいう謎変数に突っ込まずに直接UserDefaultsに保存したほうが良いですね…。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2