RxSwift에서 에러를 관리하는 방법에는
가 있습니다.
: 기본값(defaultValue)로 error를 복구합니다.
에러 없이 sequence를 지속하여 onError알림에서 복구합니다.
Catch 연산자는 소스 observable에서 onError알림이 오면,
관찰자에게 전달하지 않고 이를 가로채서 다른 itemdlsk sequence item으로 대체하여 결과 observable이 정상적으로 종료, 혹은 종료되지 않도록 합니다.
public func `catch`(_ handler: @escaping (Error) throws -> RxSwift.Observable<Self.Element>) -> RxSwift.Observable<Self.Element>
enum MyError: Error {
case error1
case error2
}
Observable.create {
$0.onError(MyError.error1)
return Disposables.create()
}
.catch { error in
switch error as! MyError {
case .error1:
return .just("error1")
case .error2:
return .just("error2")
}
}
.subscribe {
print($0)
}
.disposed(by: disposeBag)
// 실행 시 다음을 출력합니다.
error1
public func catchAndReturn(_ element: Self.Element) -> RxSwift.Observable<Self.Element>
enum MyError: Error {
case error1
case error2
}
Observable.create {
$0.onError(MyError.error1)
return Disposables.create()
}
.catchAndReturn("error")
.subscribe {
print($0)
}
.disposed(by: disposeBag)
// 실행시 다음을 출력합니다.
next(error)
completed
만약 구독 전에 catchAndReturn을 해주지 않았다면
Unhandled error happened: error1
이와 같이 출력됩니다.
: 제한적, 혹은 무제한적으로 재시도 합니다.
만약 소스 observable에서 error가 발생한다면 오류 없이 완료(종료)되기를 바라며 재구독합니다
Retry 연산자는 onError 알림이 오면, 관찰자에게 이를 전달하기보다 해당 sequence를 오류 없이 종료할 수 있도록 소스 observable을 재구독하여 다시 한번 기회를 제공합니다.
Retry는 sequence가 error로 인해 종료되더라도 관찰자에게 항상 onNext를 전달하기때문에 중복 방출이 발생할 수 있습니다.
public func retry() -> RxSwift.Observable<Self.Element>
따라서 다음과 같이 재시도 횟수를 제한해줄 수도 있습니다.
소스 observable은 계속해서 error만 전달하기 때문에
Unhandled error happened: error1
를 출력합니다.
sun02님 안녕하세요!!
저는 이제 막 swift를 독학으로 공부중인 한 학생입니다.
혹시 RxSwift를 어떤 교재?나 방법으로 공부하는지 알 수 있을까요??????