gpt4 book ai didi

ios - 如何在 Swift 中为 UserDefaults 使用 KVO?

转载 作者:IT王子 更新时间:2023-10-29 05:25:02 25 4
gpt4 key购买 nike

我正在重写应用程序的一部分,并找到了这段代码:

fileprivate let defaults = UserDefaults.standard

func storeValue(_ value: AnyObject, forKey key:String) {
defaults.set(value, forKey: key)
defaults.synchronize()

NotificationCenter.default.post(name: Notification.Name(rawValue: "persistanceServiceValueChangedNotification"), object: key)
}
func getValueForKey(_ key:String, defaultValue:AnyObject? = nil) -> AnyObject? {
return defaults.object(forKey: key) as AnyObject? ?? defaultValue
}

当 CMD 单击 defaults.synchronize() 行时,我看到 synchronize is planned deprecated。代码中是这样写的:

/*!
-synchronize is deprecated and will be marked with the NS_DEPRECATED macro in a future release.

-synchronize blocks the calling thread until all in-progress set operations have completed. This is no longer necessary. Replacements for previous uses of -synchronize depend on what the intent of calling synchronize was. If you synchronized...
- ...before reading in order to fetch updated values: remove the synchronize call
- ...after writing in order to notify another program to read: the other program can use KVO to observe the default without needing to notify
- ...before exiting in a non-app (command line tool, agent, or daemon) process: call CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication)
- ...for any other reason: remove the synchronize call
*/

据我所知,在我的案例中的用法符合第二个描述:同步after 写入,以便通知其他人。

它建议使用 KVO 来 ovserve,但是如何呢?当我搜索这个时,我发现了一堆稍旧的 Objective-C 示例。观察 UserDefaults 的最佳做法是什么?

最佳答案

从 iOS 11 + Swift 4 开始,推荐的方法(根据 SwiftLint )是使用基于 block 的 KVO API。

示例:

假设我在用户默认值中存储了一个整数值,它称为 greetingsCount

首先,我需要使用 动态变量 扩展 UserDefaults,该变量与您要观察的用户默认键具有相同的名称:

extension UserDefaults {
@objc dynamic var greetingsCount: Int {
return integer(forKey: "greetingsCount")
}
}

这允许我们稍后定义观察的关键路径,如下所示:

var observer: NSKeyValueObservation?

init() {
observer = UserDefaults.standard.observe(\.greetingsCount, options: [.initial, .new], changeHandler: { (defaults, change) in
// your change logic here
})
}

永远不要忘记清理:

deinit {
observer?.invalidate()
}

关于ios - 如何在 Swift 中为 UserDefaults 使用 KVO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43963220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com