RxSwift 의 Error 관리
RxSwift 에서의 에러 관리는 프레임워크 중 하나로 분리되어 있다.
바로 catch 와 retry.
따로 따로 사용하기 보다 catch 와 retry 를 조합해서 사용할 수 있을 것이다.
"몇번 까지 재시도 후, 안되면 에러를 특정 방식으로 내뱉어라" 등으로 말이다.
catch
default value 로 에러를 복구하는 방식
RxSwift 에는 catch 계열의 두 가지 주요 연산자가 있다.
① catch
먼저 catch 연산자이다.
클로저를 매개변수로 받아서 완전히 다른 형태의 Observable 로 반환해주는 연산자이다.
func catch(_ handler:) -> RxSwift.Observable<Self.Element>
예시는 다음과 같다.
enum MyError: Error {
case anError
case criticalError
}
Observable.create {
$0.onError(MyError.anError)
return Disposables.create()
}
.catch { error in
switch error as? MyError {
case .anError:
return .just("괜찮아요!")
case .criticalError:
return .just("펑")
}
}
.subscribe {
print($0)
}
.disposed(by: disposeBag)
② catchAndReturn
에러를 무시하고, 이전에 선언해둔 값을 반환한다. 앞서 표현한 catch 에 비해 제한적이다. 어떤 에러가 발생하든 동일한 값이 반환되기 때문이다.
func catchAndReturn(_ element: Self.Element) -> RxSwift.Observable<Self.Element>
다음은 사용 예시이다. 에러를 방출하고 종료되는 것이 아닌 에러 문구를 문자열을 감싸서 next 이벤트로 방출한다.
enum MyError: Error {
case anError
}
Observable.create {
$0.onError(MyError.anError)
return Disposables.create()
}
.catchAndError("에러 그만!!")
.subscribe {
print($0)
}
.disposed(by: disposeBag)
----------------
next(에러 그만!!)
completed
retry
제한적 or 무제한으로 재시도하는 방식이다.
func retry() -> RxSwift.Observable<Self.Element>
에러가 발생하지 않을 때 까지 무한정으로 계속해서 요청을 한다.
Observable.create {
$0.onError(MyError.anError)
return Disposables.create()
}
.retry()
...
너무 비효율적인데...? 그래서 재시도 횟수를 제한할 수 있도록 한다.
retry(횟수) 만큼 두면 횟수 만큼 재시도한다.
Observable.create {
$0.onError(MyError.anError)
return Disposables.create()
}
.retry(10000)
...
' iOS > RxSwift' 카테고리의 다른 글
RxSwift - Relay와 Drive (0) | 2023.01.29 |
---|---|
RxSwift - extension Reactive는 무엇일까? (0) | 2023.01.19 |
RxSwift - TimeBasedOperators (0) | 2022.11.07 |
RxSwift - Sequence 내부의 요소들간의 결합 연산자(reduce, scan) (0) | 2022.11.07 |
RxSwift - 하나의 Observable 가 Trigger 역할 후 Observable 들을 조합하는 방법(withLatestFrom, sample, amb, switchLatest) (0) | 2022.11.06 |