Может ли адаптация Swift KVO обрабатывать пользовательские цели? - PullRequest
0 голосов
/ 01 апреля 2020

Чтобы выполнить KVO в Swift, вы создаете класс @objc на основе NSObject и можете наблюдать свойства, которые хранятся и помечаются @objc и dynamic.

  • Можете ли вы наблюдать за вычисленными свойствами (то есть @objc и dynamic)?

Я только что взглянул на руководство Objective- C, и оно показало, что вы можете пометить зависимости KVO для вычисляемого свойства. И (я думаю) наблюдать за изменением свойства массива на уровне элемента. Можно ли что-то из этого сделать в Swift?

1 Ответ

0 голосов
/ 01 апреля 2020

Вы спросили:

Можете ли вы наблюдать за вычисленными свойствами (которые @objc и dynamic)?

Да. Просто отметьте ваше вычисленное свойство @objc и dynamic, и когда вызывается установщик для вычисляемого свойства, будет вызван наблюдатель.


Например, рассмотрим класс синхронизатора, где вы хотите чтобы наблюдать вычисленное свойство, value:

class Synchronized: NSObject {
    private var _value: Int
    private let queue = DispatchQueue(label: "synchronizer", attributes: .concurrent)

    init(value: Int) {
        _value = value
        super.init()
    }

    @objc dynamic var value: Int {
        get { queue.sync { _value } }
        set { queue.async(flags: .barrier) { self._value = newValue} }
    }
}

Здесь value является вычисляемой переменной, которую вы можете set, и все обычные КВО могут иметь место:

token = foo.observe(\.value, options: .new) { _, change in
    print(change.newValue ?? "Unknown")
}

Этот наблюдатель срабатывает, когда вызывается установщик value.


Единственный трюк будет, если вы хотите, чтобы сработало уведомление KVO, если значение, возвращаемое вычисленным свойством, изменяется с помощью чего-то другого, кроме установщика вычисляемого свойства. В этом случае вам придется вручную выдавать уведомления KVO.

...