Наблюдение за несколькими причинами controlEvent «Обнаружена аномалия повторного входа». Предупреждающее сообщение - PullRequest
0 голосов
/ 23 июня 2018

Я новичок в RxSwift и сегодня сталкиваюсь с проблемой, которую не могу решить.Я хочу наблюдать за controlEvent с в UITextField.

Код:

textField.rx
    .controlEvent([.editingDidEndOnExit, .editingDidEnd])
    .subscribe(onNext: { [weak self] in
        // do stuff
    })
    .disposed(by: disposeBag)

Я хочу сейчас, когда textField подает в отставку, чтобы быть первым респондентом или пользователь нажимает на return кнопкаКод работает нормально, когда я выполняю строку: textField.resignFirstResponder(), но когда я нажимаю на кнопку return, я получаю предупреждение:

was Обнаружена аномалия повторного входа.Отладка: для устранения этой проблемы вы можете установить точку останова в /Users/laxmorek/Documents/projects/meetingapplication-ios/Pods/RxSwift/RxSwift/Rx.swift:97 и наблюдать за стеком вызовов.Проблема: это поведение нарушает грамматику наблюдаемой последовательности.next (error | completed)? Это поведение нарушает грамматику, потому что есть пересекающиеся события последовательности.Наблюдаемая последовательность пытается отправить событие до завершения отправки предыдущего события.Интерпретация: Это может означать, что в вашем коде есть какая-то неожиданная циклическая зависимость или что система не ведет себя ожидаемым образом.Помощь: Если это ожидаемое поведение, это сообщение может быть подавлено путем добавления .observeOn(MainScheduler.asyncInstance) или путем чередования событий последовательности другим способом.

Я не понимаю этого.

  • Как правильно наблюдать несколько controlEvent в RxSwift?
  • Почему я получаю это предупреждение?Что не так с моей настройкой наблюдения?

Редактировать

Временное решение состоит в том, что я разделил свой код следующим образом:

textField.rx
    .controlEvent(.editingDidEndOnExit)
    .subscribe(onNext: { [weak self] in
        self?.isSelected = false
    })
    .disposed(by: disposeBag)
textField.rx
    .controlEvent(.editingDidEnd)
    .subscribe(onNext: { [weak self] in
        self?.isSelected = false
    })
    .disposed(by: disposeBag)

Но это дублирование кода невыглядят очень хорошо.: /

1 Ответ

0 голосов
/ 22 октября 2018

Это означает, что события отправляются из другого потока. Указывая MainScheduler.asyncInstance, вы указываете, что события отправляются потоком MainScheduler.asyncInstance, что позволит избежать проблемы параллелизма в событии onNext.

Попробуйте это:

textField.rx
    .controlEvent([.editingDidEndOnExit, .editingDidEnd])
    .observeOn(MainScheduler.asyncInstance)
    .subscribe(onNext: { [weak self] in
        // do stuff
    })
    .disposed(by: disposeBag)
...