KVO - наблюдать () changeHandler не вызывается - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу реализовать то, что 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)
    }
}

Model.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"])
    }
}

1 Ответ

0 голосов
/ 06 ноября 2018

Вам необходимо провести строгую ссылку на наблюдение

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"])
    }
}
...