RxSwift - onError испускается дважды - PullRequest
0 голосов
/ 06 октября 2018

Я экспериментировал с RxSwift и ищу помощь в правильном способе работы с наблюдателями.У меня есть наблюдатель с наблюдением за Опубликовать тему .

authPublisherSubject.asObserver()

        .subscribe(onNext: { (status) in

        }, onError: { [unowned self] (error) in

        }, onCompleted: { [unowned self] in

  }).disposed(by: disposeBag)

Ниже перечислены обязанности этого наблюдателя

  1. Отображение индикатора активности
  2. Скрыть индикатор активности
  3. Показать ошибку, если есть
  4. Продолжить в случае успешного входа в систему

Я подписываюсь на этого наблюдателя каждый раз, когда пользователь нажимает кнопку входа.Правильный ли это подход?

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

Я не могу понять, что здесь происходит.

Ответы [ 2 ]

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

Кажется, здесь происходит несколько заблуждений.

Во-первых, вы не подписываетесь на Observer, вы подписываетесь на Observable.Наблюдаемое - это то, что можно наблюдать, наблюдатель делает наблюдение.Для меня лучший способ думать об этом состоит в том, что Observable производит значений, а Observer потребляет их.Таким образом, вы subscribe до Observable с.Ваш пример кода работает, потому что функция asObserver () просто возвращает self.Это прискорбно.

Во-вторых, Rx - декларативный подход к программированию, а не императив.Это означает, что вы настраиваете цепочку Rx только один раз, а не «каждый раз, когда нажимаете кнопку».Настройте подписку только один раз в viewDidLoad контроллера представления.Теперь нажатия кнопок не генерируют события ошибок, поэтому в цепочке должно быть что-то, о чем вы не упомянули, что это ошибка.

Как вы упоминали в комментарии, если ошибка возникает, онаразорвет наблюдаемую цепь.Есть несколько способов справиться с этим.Первое и самое очевидное - убедиться, что ничто в цепочке не может выдать ошибку.Другой подход состоит в том, чтобы обернуть оператора, который может вызвать ошибку, в flatMap, а затем либо использовать materialize() или catchError в flatMap.Важно не допустить выхода ошибки из flatMap из-за ошибки, потому что если это произойдет, она разорвет основную цепочку.

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

Я подписываюсь на этого наблюдателя каждый раз, когда пользователь нажимает кнопку входа.Это правильный подход?

  • НЕТ, нужно подписаться только один раз.При каждом входе в систему кликните на подписку снова и снова, поэтому вы получили сообщения дважды.Для этого вы должны добавить подписку в методе viewWillAppear.Попробуйте, надеюсь, это сработает.
...