RxSwift를 21일간 공부하는 루틴
"Rx를 기깔나게 쓰는 신입개발자 도전" 시작 🚀
프로그램을 구현할 때, 에러 핸들링은 중요하다고 생각한다.
왜냐하면 발생할 수 있는 에러에 대응하지 못하면 유저가 서비스를 이용할 때 불편함을 겪고, 좋은 품질을 제공하지 못하기 때문이다.
swift 를 사용하면서 Result<Value, Error>
를 활용해 성공일 때는 , 현재 작업의 결과값을 저장할 수 있고, 실패일때는, 에러를 저장할 수 있다.
RxSwift 에서도 에러핸들링 연산자를 제공해 주는데 오늘은 이부분에 대해 정리해 보겠다.
catch 연산자를 보게되면 에러가 파라미터인 클로저를 파라미터로 받고, 이 클로저는 Observable을 return 하게 된다.
catch 연산자는 source observable이 next나 completed 이벤트를 방출하면 그대로 전달하지만, 만약 error 이벤트를 방출하게 되면, source observable을 반환된 새로운 observable로 대체하게 된다.
let source = PublishSubject<Int>()
let recovery = BehaviorSubject<Int>(value: 0)
source
.catch { _ in recovery }
.subscribe { print($0) }
.disposed(by: disposeBag)
source.onError(Err.err)
위의 코드 처럼 source observable 이 error 이벤트를 전달했을때, catch 연산자를 통해 recovery observable로 대체 할 수 있다.
만약 source.onError(Err.err)
처럼 에러가 발생하지 않고, 정상적으로 next 이벤트를 source.onNext(1)
처럼 전달했다면, next(1)이 출력이 될 것이다. 하지만 source.onError(Err.err)
처럼 에러 이벤트를 전달했기에 대체 observable인 recovery 의 next(0)이 전달이 된다.