KVO Swift: newValue всегда равно нулю - PullRequest
0 голосов
/ 03 июня 2019

Имея следующий пример:

import UIKit

@objc class ViewController: UIViewController {

    @objc dynamic var buggyApple: NSObject?

    var obs: NSKeyValueObservation?

    override func viewDidLoad() {
        super.viewDidLoad()
        obs = observe(\.buggyApple, changeHandler: { (obj, change) in
            print(change)
        })
        buggyApple = NSObject()
        buggyApple = NSObject()
    }
}

Я получаю соответствующий вывод в консоли отладки:

NSKeyValueObservedChange<Optional<NSObject>>(kind: __C.NSKeyValueChange, newValue: Optional(nil), oldValue: Optional(nil), indexes: nil, isPrior: false)
NSKeyValueObservedChange<Optional<NSObject>>(kind: __C.NSKeyValueChange, newValue: Optional(nil), oldValue: Optional(nil), indexes: nil, isPrior: false)

При проверке объекта ViewController в точке останова внутри функции обратного вызова вLLDB, я получаю следующее:

(lldb) po obj.buggyApple
▿ Optional<NSObject>
  - some : <NSObject: 0x600000908fa0>

Итак, фактически, новый NSObject был успешно отправлен, однако change по-прежнему ссылается nil.Есть ли проблема в моем коде и как это исправить?

1 Ответ

3 голосов
/ 03 июня 2019

Вам необходимо указать параметр new для входного аргумента options метода observer, чтобы получить новое значение в change.

obs = observe(\.buggyApple, options: [.new], changeHandler: { (obj, change) in
    print(change)
})
.
...