如何从 UserDefaults 获取更新的值?

How can I get an updated value from UserDefaults?

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

然而,我的基础 viewcontroller 正在将他们推回入职流程,因为 UserDefaults.standard.bool(forKey: "ONBOARDING|COMPLETE") returning 错误。

但是,如果我重新启动我的应用程序,则会 return 为真,并且它们会被推送到正确的 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: { })
        }
    }
}

我的入职控制器有一个方法,我用它来将值设置为完整

  @objc func handleCompleteOnboarding() {

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

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

将此移到 dismiss 之外。

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

您基本上在设置值和调用 viewDidAppear 方法之间创建了竞争条件。