KVO - наблюдать() 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"])
    }
}

person kusumoto_teruya    schedule 06.11.2018    source источник


Ответы (1)


Вы должны держать сильную ссылку на наблюдение

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"])
    }
}
person Sh_Khan    schedule 06.11.2018