RxSwift官方使用示例之<錯誤處理操作符>
本文是示例主要來自於官方的例項程式碼,可從這裡下載 ,例項程式碼稍有改動。其中的圖片來自於reactivex.io/
本文主要的作用是檢視例項程式碼並檢視對應例項程式碼的效果,不需要執行專案
操作符目錄
- RxSwift官方使用示例之<建立和訂閱Observables>
- RxSwift官方使用示例之<使用Subjects>
- RxSwift官方使用示例之<組合操作符>
- RxSwift官方使用示例之<轉換操作符>
- RxSwift官方使用示例之<過濾及條件操作符>
- RxSwift官方使用示例之<數學和聚合操作符>
- RxSwift官方使用示例之<可連線操作符>
- RxSwift官方使用示例之<錯誤處理操作符>
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
```
let disposeBag = DisposeBag()
let sequenceThatFails = 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
序列來恢復
```
let disposeBag = DisposeBag()
var count = 1
let sequenceThatErrors = Observable
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
序列來恢復,此時最多嘗試指定次數
```
let disposeBag = DisposeBag()
var count = 1
let sequenceThatErrors = Observable
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