Swift 4 中的键-值观察

5

我在我的Swift 4项目中有以下代码。

class DishesTableViewController : UITableViewController {


    private var token :NSKeyValueObservation?

    @objc dynamic private(set) var dishes :[Dish] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        // configure the observation
        token = self.observe(\.dishes) { object, change in

            // change is always nil
            print(object)
            print(change)
        }

        updateTableView()
    }

每当菜肴数组被更改时,观察者就会被触发。但我的问题是如何获得实际发生的更改,也就是如何访问触发更改的实际菜肴对象?

1个回答

6

我认为 change 返回 nil 的原因是因为您没有指定选项。

重写如下:

override func viewDidLoad() {
    super.viewDidLoad()

    // configure the observation
    token = self.observe(\.dishes, options: [.new,.old]) { object, change in

        print(object)
        let set1 = Set(change.newArray!)
        let set2 = Set(change.oldArray!)

        let filter = Array(set1.subtract(set2))
        print(filter)

    }

    updateTableView()
}

请注意,这里对于你的“菜肴”对象做了一些猜测。我假设你已经让它符合“Equatable”协议,这是解决方案必须要做的一个步骤。
更新:现在,这个要求已经反映在官方的Apple文档中,文档链接在此:here.
引用部分:
如果你不需要知道属性发生了什么改变,可以省略options参数。省略options参数会放弃存储新旧属性值,这会导致oldValue和newValue属性都为空(nil)。

1
在我的情况下,changeHandler 并没有被调用,因为我没有包括 options 参数。我建议始终包括它。 - Nick Gaens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接