自学内容网 自学内容网

RxSwift系列(四)异常处理和调试操作

一、异常处理

1.catchErrorJustReturn

当遇到 error 事件的时候,就返回指定的值,然后结束。

enum MyError: Error {
    case A
    case 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 = 1
 
let sequenceThatErrors = Observable<String>.create { observer in
    observer.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

原文地址:https://blog.csdn.net/yaojie5519/article/details/142727091

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!