首页 > 解决方案 > KVO - 未调用observe() changeHandler

问题描述

我要实现的是ViewController观察Model' 属性。
但是,observe()不会调用 changeHandler 方法。
我该如何解决?

ViewController.swift

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        Model.sharedInstance.observe(\.dataSource, options: .new) { (dataSource, change) in
            print("updated! ", dataSource, change) // not called...
        }

        Timer.scheduledTimer(timeInterval: 2.0, target: Model.sharedInstance, selector: #selector(Model.update), userInfo: nil, repeats: true)
    }
}

模型.swift

class Model: NSObject {
    @objc dynamic var dataSource = [Dictionary<String, Any>]()

    class var sharedInstance: Model {
        struct Singleton {
            static let instance: Model = Model()
        }
        return Singleton.instance
    }

    @objc func update() {
        dataSource.append(["key": "value"])
    }
}

标签: swiftkey-value-observing

解决方案


你需要对观察有强烈的参考

class ViewController: UIViewController {


    var ob:NSKeyValueObservation! /// the key item

    override func viewDidLoad() {
        super.viewDidLoad()

        ob = Model.sharedInstance.observe(\.dataSource, options: .new) { (dataSource, change) in
            print("updated! ", dataSource, change) // not called...
        }

        Timer.scheduledTimer(timeInterval: 2.0, target: Model.sharedInstance, selector: #selector(Model.update), userInfo: nil, repeats: true)
    }
}


class Model: NSObject {
    @objc dynamic var dataSource = [Dictionary<String, Any>]()

    class var sharedInstance: Model {
        struct Singleton {
            static let instance: Model = Model()
        }
        return Singleton.instance
    }

    @objc func update() {
        dataSource.append(["key": "value"])
    }
}

模型也很简单

class Model: NSObject {

    @objc dynamic var dataSource = [[String:Any]]()

    static let sharedInstance = Model()

    @objc func update() {
        dataSource.append(["key": "value"])
    }
}

推荐阅读