同步设置 UserDefaults 中的值

set value in UserDefaults synchronously

我试图在 swift 的 UserDefault 中保存布尔值。 所以当我在 userDefault 中设置值时,我的下一个指令是切换到视图控制器并关闭当前视图控制器。

所以,现在发生的情况是,有时 userDefault 将值保存在数据库中,有时则不会。 我阅读了 Apple 的文档 https://developer.apple.com/documentation/foundation/userdefaults 并发现

At runtime, you use UserDefaults objects to read the defaults that your app uses from a user’s defaults database. UserDefaults caches the information to avoid having to open the user’s defaults database each time you need a default value. When you set a default value, it’s changed synchronously within your process, and asynchronously to persistent storage and other processes.

所以,我猜是因为在下一行我打开了一个新控制器并关闭了当前控制器,因此存在不一致。

这是我的代码

func setWalkthroughShown(completionHandler: @escaping ()->()) {
        UserDefaults.standard.set(true, forKey: isWalkthroughCompleted)
        UserDefaults.standard.synchronize()
        completionHandler()
    }

我什至调用了 UserDefaults.standard.synchronize() 以便操作可以同步。 即使在文档中明确写明不要使用此功能。 有人可以指导我哪里错了吗?如何在关闭当前进程之前保存所有位置?

这是我用来检索值的函数

func isWalkthroughShown() -> Bool {
        return UserDefaults.standard.bool(forKey: isWalkthroughCompleted)
    }

这里的 isWalkthroughCompleted 是一个字符串,您可以看到我使用相同的字符串来保存和检索值

实际上,编码没有语法错误。

我实际上是在用错误的方式测试它。 在提交了在 userdefaults 中保存数据的请求后,我立即重新编译并且作为异步存储值,所以有时由于终止进程我遇到了这个问题。 感谢@matt。 详情