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