在Android開發上,RxJava已經是非常重要的組成之一。最近在用Swift開發iOS應用,考慮在架構設計上使用RxSwift。
添加依賴
# Podfile
use_frameworks!
target 'YOUR_TARGET_NAME' do
pod 'RxSwift', '~> 5'
pod 'RxCocoa', '~> 5'
pod 'RxBlocking', '~> 5'
end
# RxTest and RxBlocking make the most sense in the context of unit/integration tests
target 'YOUR_TESTING_TARGET' do
pod 'RxTest', '~> 5'
end
創建 Observable
import RxSwift
...
let observable = Observable<Int>.create { (observer) -> Disposable in
observer.onNext(1)
observer.onCompleted()
return Disposables.create()
}
定義 onError調用
struct MyError:Error {
var message = ""
init(message:String) {
self.message = message
}
}
let observable = Observable<Int>.create { (observer) -> Disposable in
let error = MyError(message: "Test Error")
observer.onError(error)
return Disposables.create()
}
subscribe
只定義一個回調
observable.subscribe({ it in
print("onNext \(it.element)")
})
定義onNext和onError
observable.subscribe(onNext: { it in
print("onNext \(it)")
},onError: { error in
print((error as! MyError).message)
})
定義onNext、onError和onCompleted
observable.subscribe(onNext: { it in
print("onNext \(it)")
},onError: { error in
print((error as! MyError).message)
},onCompleted: {
})
RxBlocking
RxBlocking是RxSwift中另外一個單獨的框架。跟RxTest一樣,也需要進行pod引入框架,需要單獨添加依賴。RxBlocking可以把RxSwift從異步響應變成同步,所以RxBlocking也多用來做單元測試。
pod 'RxBlocking'
import RxSwift
import RxBlocking
...
do{
let result = try observable.toBlocking().first()
print("結果:\(result)")
}catch{
print((error as! MyError).message)
}
應用場景
比如我們使用RxSwift實現圖片上傳,在發佈動態的時候需要先上傳圖片然後調用基於RxSwift實現的網絡請求。加上我們不想嵌套調用,就可以通過toBlocking同步調用。
RxTest
RxTest 是可以用來構建RxSwift自動化測試的包,需要單獨需要進行pod引入框架。