Это такая странная проблема, с которой я столкнулся. Я устанавливаю и читаю 2 различных логических предпочтения пользователя. Я обновляю пользовательские настройки в зависимости от того, что пользователь делает. Затем я читаю их, когда пользователь снова открывает приложение. Когда пользователь убивает приложение, Я вижу, что applicationWillTerminate всегда вызывается правильно и что 2 сеттера вызываются с правильными значениями. Когда я снова открываю приложение, 2 значения верны (то, что они были последними установить в applicationWillTerminate). Тем не менее, примерно в 20% случаев они не верны. Я буду делать точный сценарий снова и снова, и я увижу, что applicationWillTerminate вызывается и две переменные устанавливаются на правильные значения. Однако, когда я снова открываю приложение, они не являются обновленными значениями примерно в 20% случаев. Я не нашел закономерностей того, почему иногда значения сохраняются навсегда, а иногда нет.
Я изучал это некоторое время и не могу найти никого, кто сталкивался с этой неустойчивой проблемой. Я попытался добавить synchronize (), хотя это будет устаревшим, и это не имело никакого значения. Я точно знаю, что мои сеттеры не будут вызывать в другой раз.
Есть идеи?
//this method is called from didFinishLaunching and only that one time
private func checkForPriorCrash() {
let appClosedProperly = UserDefaults.standard.bool(forKey: UserInterface.Keys.appClosedProperly)
let lastStateWasActive = UserDefaults.standard.bool(forKey: UserInterface.Keys.lastStateWasActive)
if !appClosedProperly && lastStateWasActive {
print("**A CRASH HAPPENED LAST TIME")
}
UserDefaults.standard.removeObject(forKey: UserInterface.Keys.appClosedProperly) //reset
UserDefaults.standard.removeObject(forKey: UserInterface.Keys.lastStateWasActive) //reset
}
private func setAppClosedProperly(_ value: Bool) {
print("set did app closed properly")
print(value)
UserDefaults.standard.set(value, forKey: UserInterface.Keys.appClosedProperly)
}
private func setLastStateWasActive(_ value: Bool) {
print("set last state was active")
print(value)
UserDefaults.standard.set(value, forKey: UserInterface.Keys.lastStateWasActive)
}
func applicationDidEnterBackground(_ application: UIApplication) {
print("in applicationDidEnterBackground")
setLastStateWasActive(false)
}
func applicationDidBecomeActive(_ application: UIApplication) {
print("in applicationDidBecomeActive")
setLastStateWasActive(true)
}
func applicationWillTerminate(_ application: UIApplication) {
print("in applicationWillTerminate")
setLastStateWasActive(false)
setAppClosedProperly(true)
}