【问题标题】:Using NSKeyValueObservation to observe value in UserDefaults使用 NSKeyValueObservation 观察 UserDefaults 中的值
【发布时间】:2017-06-08 00:52:58
【问题描述】:

我想使用 Swift 4 中基于块的 KVO 来观察 UserDefaults 中值的变化。我可以这样做是为了观察WKWebViewestimatedProgress 的关键路径,但UserDefaults 没有成功,因为提供的关键路径不是它正在寻找的。仅提供一个字符串是不够的(无法推断通用参数“值”),在其前面加上 \ 是不够的(表达式类型不明确,没有更多上下文)。创建KeyPath 以观察UserDefaults 中的值的正确方法是什么?

observerToken = UserDefaults.standard.observe("myvalue") { (object, change) in
    //...
}

【问题讨论】:

  • 我认为您需要为 UserDefaults 添加一个观察者确实更改通知并在那里做任何您需要的事情

标签: ios swift key-value-observing swift4


【解决方案1】:

是的,这是可能的。首先你需要将 keypath 定义为

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

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

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

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

}
UserDefaults.standard.isRunningWWDC = true

【讨论】:

  • 这适用于我添加的新密钥,但即使我删除并重新安装应用程序,我也无法使其适用于现有密钥。你以前见过吗?代码没有什么不同,我要疯了。
  • 是的,所以包含.initial 会触发更改块,但稍后不会触发更改。
  • 经过努力,我认为不可能在 UserDefaults 上应用 KVO 来观察每一个变化。
  • 我还必须将设置器添加到键路径定义中,并让我的对象使用该设置器(而不是设置底层的 UserDefaults 键)。然后开始显示编辑以及最初的编辑。
  • @JordanH 我刚刚遇到了和你上面描述的一样的问题:观察者只是第一次被触发。我通过更改dynamic var isRunningWWDC 中的变量名称来修复它。 var 必须与用户默认键完全匹配!
猜你喜欢
  • 1970-01-01
  • 2017-11-15
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 2020-05-13
  • 1970-01-01
相关资源
最近更新 更多