使用NSKeyValueObservation观察UserDefaults中的值 [英] Using NSKeyValueObservation to observe value in UserDefaults

查看:374
本文介绍了使用NSKeyValueObservation观察UserDefaults中的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用Swift 4中基于块的KVO来观察UserDefaults中值的变化.我可以这样做来观察WKWebViewestimatedProgress的键路径,但是对于UserDefaults却没有成功,因为提供的键路径不是它想要的.仅提供一个字符串是不够的(无法推断出通用参数'Value'),用\作为前缀是不够的(如果没有更多上下文,表达式的类型将是模棱两可的).创建KeyPath以观察UserDefaults中的值的正确方法是什么?

I would like to use the block-based KVO from Swift 4 to observe changes to a value in UserDefaults. I am able to do this for observing a key path for WKWebView's estimatedProgress but haven't been successful with UserDefaults because the provided key path isn't what it's looking for. Providing just a String isn't enough (Generic parameter 'Value' could not be inferred), prefixing it with \ isn't enough (Type of expression is ambiguous without more context). What's the correct way to create the KeyPath to observe a value in UserDefaults?

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

推荐答案

是可能的.首先,您需要将键路径定义为

Yes its possible.First of all you need to define keypath as

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

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

And use that keypath for block based KVO as

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

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

}
UserDefaults.standard.isRunningWWDC = true

这篇关于使用NSKeyValueObservation观察UserDefaults中的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆