使用NSKeyValueObservation来观察UserDefaults中的值

Jor*_*n H 7 key-value-observing ios swift swift4

我想使用Swift 4中基于块的KVO来观察值的变化UserDefaults.我能够观察的关键路径做到这一点WKWebViewestimatedProgress,但都没有成功与UserDefaults因为提供的关键路径是不是它的寻找.提供一个字符串是不够的(无法推断通用参数'值'),前缀\不够(表达式类型没有更多上下文是模糊的).创建KeyPath观察值的正确方法是UserDefaults什么?

observerToken = UserDefaults.standard.observe("myvalue") { (object, change) in
    //...
}
Run Code Online (Sandbox Code Playgroud)

LC *_*C 웃 5

是的,它是可能的。首先,您需要将keypath定义为

extension UserDefaults
{
    @objc dynamic var isRunningWWDC: Bool
    {
        get {
            return bool(forKey: "isRunningWWDC")
        }
        set {
            set(newValue, forKey: "isRunningWWDC")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并将该键路径用于基于块的KVO作为

var observerToken:NSKeyValueObservation?
observerToken = UserDefaults.standard.observe(\.isRunningWWDC, options:[.new,.old])
{ (object, change) in

    print("Change is \(object.isRunningWWDC)")

}
UserDefaults.standard.isRunningWWDC = true
Run Code Online (Sandbox Code Playgroud)

  • 这适用于我添加的新密钥,但是即使删除并重新安装该应用程序,也无法使它适用于现有密钥。你以前看过吗?代码没有什么不同,我要疯了。 (2认同)
  • 是的,所以包含`.initial`会触发更改块,但以后不会在更改后触发。 (2认同)
  • 经过艰苦的尝试,我认为不可能在UserDefaults上应用KVO来观察每个更改。 (2认同)
  • 我还必须将设置器添加到键路径定义中,并让我的对象使用该设置器(而不设置基础的UserDefaults键)。然后开始显示编辑内容和初始内容。 (2认同)
  • @JordanH 我刚刚遇到了与上面描述的相同的问题:观察者仅在第一次被触发。我通过更改“dynamic var isRunningWWDC”中的变量名称来修复它。var 必须与用户默认键完全匹配! (2认同)