RxSwift官方使用示例之<錯誤處理操作符>

語言: CN / TW / HK

本文是示例主要來自於官方的例項程式碼,可從這裡下載 ,例項程式碼稍有改動。其中的圖片來自於reactivex.io/

本文主要的作用是檢視例項程式碼並檢視對應例項程式碼的效果,不需要執行專案

操作符目錄

debug 操作符會列印所有的 subscriptions, events, disposals

公用程式碼,之後的程式碼中會用到

enum TestError: Error {     case test }

catchAndReturn

通過傳送一個元素並立即終止,來從發出錯誤的 Observable 序列中恢復 ``` let disposeBag = DisposeBag()

let sequenceThatFails = PublishSubject()

sequenceThatFails .catchAndReturn("😊") .subscribe { print($0) } .disposed(by: disposeBag)

sequenceThatFails.onNext("😬") sequenceThatFails.onNext("😨") sequenceThatFails.onNext("😡") sequenceThatFails.onNext("🔴") sequenceThatFails.onError(TestError.test) print("over") ``` 列印

next(😬) next(😨) next(😡) next(🔴) next(😊) completed over

catchError

通過轉換到提供的可恢復的 Observable 序列來恢復發出錯誤的 Observable image.png ``` let disposeBag = DisposeBag()

let sequenceThatFails = PublishSubject() let recoverySequence = PublishSubject()

sequenceThatFails .catch { print("Error:", $0) return recoverySequence } .subscribe { print($0) } .disposed(by: disposeBag)

sequenceThatFails.onNext("😬") sequenceThatFails.onNext("😨") sequenceThatFails.onNext("😡") sequenceThatFails.onNext("🔴") sequenceThatFails.onError(TestError.test)

recoverySequence.onNext("😊") ``` 列印

next(😬) next(😨) next(😡) next(🔴) Error: test next(😊)

retry

當發生錯誤時,嘗試重新訂閱該 Observalbe 序列來恢復 image.png ``` let disposeBag = DisposeBag() var count = 1

let sequenceThatErrors = Observable.create { observer in observer.onNext("🍎") observer.onNext("🍐") observer.onNext("🍊")

if count == 1 {
    observer.onError(TestError.test)
    print("Error encountered")
    count += 1
}

observer.onNext("🐶")
observer.onNext("🐱")
observer.onNext("🐭")
observer.onCompleted()

return Disposables.create()

}

sequenceThatErrors .retry() .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) ``` 列印

🍎 🍐 🍊 Error encountered 🍎 🍐 🍊 🐶 🐱 🐭

retry(_:)

當發生錯誤時,嘗試重新訂閱該 Observalbe 序列來恢復,此時最多嘗試指定次數 image.png ``` let disposeBag = DisposeBag() var count = 1

let sequenceThatErrors = Observable.create { observer in observer.onNext("🍎") observer.onNext("🍐") observer.onNext("🍊")

if count < 5 {
    observer.onError(TestError.test)
    print("Error encountered")
    count += 1
}

observer.onNext("🐶")
observer.onNext("🐱")
observer.onNext("🐭")
observer.onCompleted()

return Disposables.create()

}

sequenceThatErrors .retry(3) .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) ``` 列印

🍎 🍐 🍊 Error encountered 🍎 🍐 🍊 Error encountered 🍎 🍐 🍊 Error encountered Unhandled error happened: test