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に保存したほうが良いですね…。