RxSwift系列(四)异常处理和调试操作
一、异常处理
1.catchErrorJustReturn
当遇到 error 事件的时候,就返回指定的值,然后结束。
enum MyError: Error {case Acase B
}let disposeBag = DisposeBag()let sequenceThatFails = PublishSubject<String>()sequenceThatFails.catchErrorJustReturn("错误").subscribe(onNext: { print($0) }).disposed(by: disposeBag)sequenceThatFails.onNext("a")
sequenceThatFails.onNext("b")
sequenceThatFails.onNext("c")
sequenceThatFails.onError(MyError.A)
sequenceThatFails.onNext("d")//运行结果:a b c 错误
2.catchError
捕获 error,并对其进行处理。同时还能返回另一个 Observable 序列进行订阅(切换到新的序列)。
let disposeBag = DisposeBag()let sequenceThatFails = PublishSubject<String>()
let recoverySequence = Observable.of("1", "2", "3")sequenceThatFails.catchError {print("Error:", $0)return recoverySequence}.subscribe(onNext: { print($0) }).disposed(by: disposeBag)sequenceThatFails.onNext("a")
sequenceThatFails.onNext("b")
sequenceThatFails.onNext("c")
sequenceThatFails.onError(MyError.A)
sequenceThatFails.onNext("d")//运行结果
//a
//b
//c
//Error: A
//1
//2
//3
3.retry
当遇到错误的时候,会重新订阅该序列。比如遇到网络请求失败时,可以进行重新连接。retry() 方法可以传入数字表示重试次数。不传的话只会重试一次。
let disposeBag = DisposeBag()
var count = 1let sequenceThatErrors = Observable<String>.create { observer inobserver.onNext("a")observer.onNext("b")//让第一个订阅时发生错误if count == 1 {observer.onError(MyError.A)print("Error encountered")count += 1}observer.onNext("c")observer.onNext("d")observer.onCompleted()return Disposables.create()
}sequenceThatErrors.retry(2) //重试2次(参数为空则只重试一次).subscribe(onNext: { print($0) }).disposed(by: disposeBag)//运行结果
//a
//b
//Error encoutered
//a
//b
//c
//d
二、调试操作
1.debug
我们可以将 debug 调试操作符添加到一个链式步骤当中,这样系统就能将所有的订阅者、事件、和处理等详细信息打印出来,方便我们开发调试。
let disposeBag = DisposeBag()Observable.of("2", "3").startWith("1").debug("调试1").subscribe(onNext: { print($0) }).disposed(by: disposeBag)
2.RxSwift.Resources.total
通过将 RxSwift.Resources.total 打印出来,我们可以查看当前 RxSwift 申请的所有资源数量。这个在检查内存泄露的时候非常有用。
print(RxSwift.Resources.total)let disposeBag = DisposeBag()print(RxSwift.Resources.total)Observable.of("BBB", "CCC").startWith("AAA").subscribe(onNext: { print($0) }).disposed(by: disposeBag)print(RxSwift.Resources.total)//运行结果
//0
//2
//AAA
//BBB
//CCC
//3