Проблемы с KVO-слушателем в Swift 4 - PullRequest
0 голосов
/ 05 мая 2018

Я использую класс ViewModel и хочу настроить наблюдателя, если какие-либо изменения в переменную loginResponse.

@objcMembers class ViewModel: NSObject {

    var count = 300
    @objc dynamic var loginResponse :String

    override init() {
        loginResponse = "1"
        super.init()
        setupTimer()
    }

    func setupTimer(){
        _ = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector:#selector(callTimer), userInfo: nil, repeats: true)
    }

    func callTimer(){
        let minutes = String(count / 60)
        let seconds = String(count % 60)
        loginResponse = minutes + ":" + seconds
        count =  count - 1
    }
}

Просмотр кода контроллера:

override func viewDidLoad() {
    super.viewDidLoad()

    _ = viewModel.observe(\ViewModel.loginResponse) { (model, changes) in
        print(changes)
    }
}

Я хочу прослушать любое изменение переменной loginResponse в моем Viewcontroller, но оно не получает обратный вызов. Что я тут не так делаю?

1 Ответ

0 голосов
/ 07 мая 2018

Функция .observe(_:options:changeHandler:) возвращает объект NSKeyValueObservation, который используется для управления временем жизни наблюдения. Когда оно будет отменено или признано недействительным, наблюдение прекратится.

Поскольку ваш контроллер вида не сохраняет ссылку на возвращенное «наблюдение», он выходит за пределы области в конце viewDidLoad и, таким образом, прекращает наблюдение.

Чтобы продолжить наблюдение в течение всего срока службы контроллера представления, сохраните возвращенное наблюдение в свойстве. Если вы «закончили» наблюдение до этого, вы можете вызвать invalidate для наблюдения или установить для свойства значение nil.

...