前言
- Swift進階之RxSwift(一)
- Swift進階之RxSwift(二)
- Swift進階之RxSwift(三)
- Demo地址迫吐,個人水平有限讯检,如有問題奸披,歡迎指出昏名!
- 本文系RxSwift學(xué)習(xí)筆記最后一章,主要內(nèi)容包含Error以及Debugging
步入正題
1.Error
當(dāng)我們創(chuàng)建Observable的時候阵面,其內(nèi)部默認(rèn)是帶有三個事件的:
- onNext
- onError
- onCompleted
正常情況下轻局,在被dispose之前都會執(zhí)行onNext事件,這也是我們希望的情況样刷,but shit happens! 這是就會執(zhí)行onError以及complete仑扑,從下面的??中來看一下具體執(zhí)行過程!
-
catchErrorJustReturn
接收到錯誤是返回特定值置鼻,可用于error在預(yù)料之中镇饮,或者確定不會發(fā)生錯誤的情況。
let disposeBag = DisposeBag()
let sequenceThatFails = PublishSubject<String>()
/// 捕捉到錯誤后返回??箕母,執(zhí)行onCompleted储藐,銷毀sequenceThatFails
sequenceThatFails
.catchErrorJustReturn("??")
.subscribe { print($0) }
.disposed(by: disposeBag)
sequenceThatFails.onNext("??")
sequenceThatFails.onNext("??")
/// 模擬發(fā)生錯誤
sequenceThatFails.onError(TestError.test)
/// 打印結(jié)果
next(??)
next(??)
next(??)
completed
-
catchError
當(dāng)捕捉到錯誤時,講執(zhí)行操作交給另外的Observable
let disposeBag = DisposeBag()
/// 創(chuàng)建兩個subject
let sequenceThatFails = PublishSubject<String>()
let recoverySequence = PublishSubject<String>()
/// shit happend! 捕捉到error時嘶是,返回recoverySequence钙勃,sequenceThatFails發(fā)送complete,銷毀sequenceThatFails聂喇。
sequenceThatFails
.catchError {
print("Error:", $0)
return recoverySequence
}
.subscribe { print($0) }
.disposed(by: disposeBag)
sequenceThatFails.onNext("??")
sequenceThatFails.onNext("??")
sequenceThatFails.onError(TestError.test)
recoverySequence.onNext("??")
/// 打印結(jié)果
next(??)
next(??)
Error: test
next(??)
-
retry and retry(_:)
發(fā)生錯誤時進行重試
let disposeBag = DisposeBag()
var count = 1
let sequenceThatErrors = Observable<String>.create { observer in
observer.onNext("??")
observer.onNext("??")
/// 模擬發(fā)生錯誤
if count == 1 {
observer.onError(TestError.test)
print("Error encountered")
count += 1
}
observer.onNext("??")
observer.onNext("??")
observer.onCompleted()
return Disposables.create()
}
sequenceThatErrors
.retry()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
發(fā)生錯誤是重試辖源,參數(shù)為次數(shù)
let disposeBag = DisposeBag()
var count = 1
let sequenceThatErrors = Observable<String>.create { observer in
observer.onNext("??")
observer.onNext("??")
if count < 5 {
observer.onError(TestError.test)
print("Error encountered")
count += 1
}
observer.onNext("??")
observer.onNext("??")
observer.onCompleted()
return Disposables.create()
}
sequenceThatErrors
.retry(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
** 開發(fā)過程中,沒有人希望出現(xiàn)錯誤希太,但是錯誤是不可避免的克饶,當(dāng)發(fā)生錯誤是我們可以通過上述方法來進行補救,我們也可以通過Debug來減少錯誤的發(fā)生誊辉!**
2.Debugging
-
debug
打印所有的訂閱矾湃,事件以及銷毀操作
let disposeBag = DisposeBag()
var count = 1
let sequenceThatErrors = Observable<String>.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)
.debug()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
-
RxSwift.Resources.total
有點類似于引用計數(shù)的東西,默認(rèn)是不開啟的堕澄,如果需要使用的話邀跃,在cocoapod文件中添加點東西,所以你的Podfile文件看起來應(yīng)該是這樣的
target 'AppTarget' do
pod 'RxSwift'
end
/// 開啟 RxSwift.Resources.total
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == 'RxSwift'
target.build_configurations.each do |config|
if config.name == 'Debug'
config.build_settings['OTHER_SWIFT_FLAGS'] ||= ['-D', 'TRACE_RESOURCES']
end
end
end
end
end
總結(jié)
終于學(xué)完了奈偏,本系列文章基本上涵蓋了RxSwift官方demo中的所有用法,我這里最多只能起到個拋磚引玉的作用躯护,Rx博大精深惊来,想要用好還是需要下點功夫的!各位加油棺滞!
** 另外裁蚁,在ReactiveObjC中有許多方法是與cocoa部分關(guān)聯(lián)的矢渊,但是在RxSwift中并不包含,需要引入RxCocoa方可使用枉证!**
碼字好辛苦的矮男,各位不吝賜個贊唄!