同步设置 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。
详情
我试图在 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。
详情