Странное поведение наблюдения ключ-значение - PullRequest
0 голосов
/ 29 января 2019

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

  1. Я написалкласс Singleton с KVC-совместимым свойством и двумя методами:
class Singleton: NSObject {
    static let sharedInstance = Singleton()

    @objc dynamic var aProperty = false

    func updateDoesntWork() {
        aProperty = !aProperty
    }

    func updateDoesWork() {
        Singleton.sharedInstance.aProperty = !aProperty
    }
}
Я добавляю наблюдателя для свойства в установочный код делегата моего приложения:
Singleton.sharedInstance.addObserver(self, forKeyPath: #keyPath(Singleton.aProperty), options: [.new], context: nil)
Я переопределяю метод observeValue() моего делегата приложения:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    NSLog("observeValue(forKeyPath: \(String(describing:keyPath)), of: \(String(describing:object)), change: \(String(describing:change)), context:\(String(describing:context)))")
}

Теперь, если я позвоню Singleton.sharedInstance.updateDoesntWork(), я не получу запись в журнале для изменения в aProperty.Свойство изменено (я проверял это в отладчике), просто уведомление не отправляется.

Принимая во внимание, что если я позвоню Singleton.sharedInstance.updateDoesWork(), все будет работать так, как я ожидал - свойство также изменилось,конечно, но самое главное, на этот раз наблюдатель получит уведомление об изменении (запись в журнале будет напечатана).

Мне не имеет смысла, что мне нужны полные Singleton.sharedInstance.aProperty, а не просто aProperty для КВО работать.Чего мне не хватает?

1 Ответ

0 голосов
/ 29 января 2019

Полагаю, у вас проблемы с использованием "var" для синглтона.Вы можете использовать следующий фрагмент для создания синглтона и инициализации некоторых значений, включая наблюдение, используемое исключительно синглтоном:

class Singleton: NSObject {
    static private var sharedInstanceObserver : NSKeyValueObservation!

    static let sharedInstance: Singleton = {
        let sInstance = Singleton()
        sharedInstanceObserver = sInstance.observe(\Singleton.aProperty, options: .new) { st, value in
            print(st, value)
        }
        return sInstance
    }()

    @objc dynamic var aProperty = false

    func updateDoesntWork() {
        aProperty = !aProperty
    }

    func updateDoesWork() {
        Singleton.sharedInstance.aProperty = !aProperty
    }
}
...