Настройки UserDefault.standard сохраняются только правильно ~ 80% времени - PullRequest
1 голос
/ 27 июня 2019

Это такая странная проблема, с которой я столкнулся. Я устанавливаю и читаю 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)
}
...