如何从UserDefaults获取更新的值?

时间:2019-01-05 09:43:02

标签: swift nsuserdefaults

我有一个Onboarding控制器,当用户完成Onboarding时,我在UserDefaults中写入一个值,然后关闭OnboardingViewController。

但是,我的基本ViewController在UserDefaults.standard.bool(forKey: "ONBOARDING|COMPLETE")返回false时将它们推回了Onboarding流程。

但是,如果我重新启动应用程序,它将返回true,并将它们推送到正确的VC。

我的基本ViewController

class ViewController: UIViewController {

    var onboardingComplete: Bool {
        get {
            return UserDefaults.standard.bool(forKey: "ONBOARDING|COMPLETE")
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        print(UserDefaults.standard.bool(forKey: "ONBOARDING|COMPLETE"))
        print(onboardingComplete)

        setBaseViewController()
    }

    fileprivate func setBaseViewController() {
        if onboardingComplete {
            print("has completed onboarding")
        } else {
            let layout = UICollectionViewFlowLayout()
            navigationController?.present(OnboardingController(collectionViewLayout: layout), animated: true, completion: { })
        }
    }
}

我的Onboarding控制器有一种方法,用于将值设置为complete

  @objc func handleCompleteOnboarding() {

        dismiss(animated: true) {
            DispatchQueue.main.async {
                UserDefaults.standard.set(true, forKey: "ONBOARDING|COMPLETE")
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

您正在完成处理程序中设置该值。

将其移到解雇之外。

@objc func handleCompleteOnboarding() {
    UserDefaults.standard.set(true, forKey: "ONBOARDING|COMPLETE")
    dismiss(animated: true)
}

您实际上已经在设置值和调用viewDidAppear方法之间创建了竞争条件。