就問此時此刻還有誰?45度仰望天空,該死!我這無處安放的魅力!swift
- RxSwift(1)— 初探
- RxSwift(2)— 核心邏輯源碼分析
- RxSwift(3)— Observable序列的建立方式
- RxSwift(4)— 高階函數(上)
- RxSwift(5)— 高階函數(下)
- RxSwift(6)— 調度者-scheduler源碼解析(上)
- RxSwift(7)— 調度者-scheduler源碼解析(下)
- RxSwift(8)— KVO底層探索(上)
- RxSwift(9)— KVO底層探索(下)
- RxSwift(10)— 場景序列總結
- RxSwift(11)— dispose源碼解析
- RxSwift(12)— Subject即攻也守
- RxSwift(13)— 爬過的坑
- RxSwift(14)— MVVM雙向綁定
RxSwift 目錄直通車 --- 和諧學習,不急不躁!app
這個篇章介紹平時開發常常運用的序列,這些序列都是由普通序列封裝而來,可是對平時開發是由大大的幫助,簡易流程,而且很是切合相關場景dom
ControlEvent
: 專門用於描述 UI 控件所產生的事件,它具備如下特徵ide
error
事件MainScheduler
訂閱(主線程訂閱)MainScheduler
監聽(主線程監聽)let controlEventOB = self.btn.rx.controlEvent(.touchUpInside)
controlEventOB.subscribe { (reslut) in
print("訂閱:\(reslut) \n \(Thread.current)")
}.disposed(by: disposeBag)
controlEventOB.subscribe { (reslut) in
print("訂閱:\(reslut) \n \(Thread.current)")
}.disposed(by: self.disposeBag)
複製代碼
events.subscribeOn(ConcurrentMainScheduler.instance)
保證主隊列調度UI響應事件
,不會存在失敗響應let observer : AnyObserver<Bool> = AnyObserver { (event) in
print("observer當前線程:\(Thread.current)")
switch event{
case .next(let isHidden) :
print("來了,請看label的狀態")
self.label.isHidden = isHidden
case .error(let error) :
print("\(error)")
case .completed :
print("完成了")
}
}
let binder = Binder<Bool>(self.label) { (lab, isHidden) in
print("Binder當前線程:\(Thread.current)")
lab.isHidden = isHidden
}
let observable = Observable<Bool>.create { (ob) -> Disposable in
ob.onNext(true)
ob.onError(NSError.init(domain: "com.lgcoooci.cn", code: 10086, userInfo: nil))
ob.onCompleted()
return Disposables.create()
}.observeOn(ConcurrentDispatchQueueScheduler(queue: DispatchQueue.global()))
// observable.bind(to: observer).disposed(by: self.disposeBag)
observable.bind(to: binder).disposed(by: self.disposeBag)
複製代碼
RxSwift
裏面也封裝了不少的binder,咱們直接開發使用很直接extension Reactive where Base: UIButton {
/// Reactive wrapper for `setTitle(_:for:)`
public func title(for controlState: UIControl.State = []) -> Binder<String?> {
return Binder(self.base) { button, title -> Void in
button.setTitle(title, for: controlState)
}
}
/// Reactive wrapper for `setImage(_:for:)`
public func image(for controlState: UIControl.State = []) -> Binder<UIImage?> {
return Binder(self.base) { button, image -> Void in
button.setImage(image, for: controlState)
}
}
/// Reactive wrapper for `setBackgroundImage(_:for:)`
public func backgroundImage(for controlState: UIControl.State = []) -> Binder<UIImage?> {
return Binder(self.base) { button, image -> Void in
button.setBackgroundImage(image, for: controlState)
}
}
}
複製代碼
Driver
是一個精心準備的特徵序列。它主要是爲了簡化 UI
層的代碼。不過若是你遇到的序列具備如下特徵,你也可使用它:函數
error
事件MainScheduler
監聽(主線程監聽)let result = self.textFiled.rx.text.orEmpty
.asDriver() // 普通序列轉化爲
.throttle(.milliseconds(500))
.flatMap {
self.dealwithData(inputText: $0)
.asDriver(onErrorJustReturn: "檢測到了錯誤")
}
// 綁定到label上面
result.map { "長度:\(($0 as! String).count)" }
.drive(self.label.rx.text)
.disposed(by: disposeBag)
// 綁定到button上面
result.map { ($0 as! String) }
.drive(self.btn.rx.title())
.disposed(by: disposeBag)
複製代碼
source.share(replay: 1, scope: .whileConnected)
序列狀態共享catchErrorJustReturn(onErrorJustReturn)
保證了無錯誤信號observeOn(DriverSharingStrategy.scheduler)
保證了調度環境在主線程Signal
和 Driver
類似,惟一的區別是,Driver
會對新觀察者回放(從新發送)上一個元素,而 Signal
不會對新觀察者回放上一個元素。源碼分析
demo
運行 label
是有值的,可是對於咱們的新的觀察者btn是沒有值error
事件MainScheduler
監聽(主線程監聽)let result = self.textFiled.rx.text.orEmpty
.asSignal(onErrorJustReturn: "沒有值") // 普通序列轉化爲signle
.throttle(.milliseconds(500))
.flatMap {
self.dealwithData(inputText: $0)
.asSignal(onErrorJustReturn: "檢測到了錯誤")
}
// 綁定到label上面
result.map { "長度:\(($0 as! String).count)" }
.emit(to: self.label.rx.text)
.disposed(by: disposeBag)
// 綁定到button上面
result.map { ($0 as! String) }
.emit(to: self.btn.rx.title())
.disposed(by: disposeBag)
複製代碼
catchErrorJustReturn(onErrorJustReturn)
保證了無錯誤信號observeOn(DriverSharingStrategy.scheduler)
保證了調度環境在主線程source.share(scope: .whileConnected)
序列狀態共享Single
是 Observable
的另一個版本。不像 Observable
能夠發出多個元素,它要麼只能發出一個元素,要麼產生一個 error
事件。post
error
事件let singleOB = Single<Any>.create { (single) -> Disposable in
print("singleOB 是否共享")
single(.success("Cooci"))
single(.error(NSError.init(domain: "com.lgcoooci.cn",
code: 10086, userInfo: nil)))
return Disposables.create()
}
singleOB.subscribe { (reslut) in
print("訂閱:\(reslut)")
}.disposed(by: disposeBag)
singleOB.subscribe { (reslut) in
print("訂閱:\(reslut)")
}.disposed(by: disposeBag)
複製代碼
Completable
是 Observable
的另一個版本。不像 Observable
能夠發出多個元素,它要麼只能產生一個 completed
事件,要麼產生一個 error
事件學習
completed
元素,或一個 error
事件Completable
適用於那種你只關心任務是否完成,而不須要在乎任務返回值的狀況。它和 Observable<Void>
有點類似。let completableOB = Completable.create { (completable) -> Disposable in
print("completableOB 是否共享")
completable(.completed)
completable(.error(NSError.init(domain: "com.lgcoooci.cn",
code: 10086, userInfo: nil)))
return Disposables.create()
}
completableOB.subscribe { (reslut) in
print("訂閱:\(reslut)")
}.disposed(by: disposeBag)
completableOB.subscribe { (reslut) in
print("訂閱:\(reslut)")
}.disposed(by: disposeBag)
複製代碼
Maybe
是 Observable
的另一個版本。它介於 Single
和 Completable
之間,它要麼只能發出一個元素,要麼產生一個completed
事件,要麼產生一個 error
事件。ui
completed
事件或者一個 error
事件Maybe
。let maybeOB = Maybe<Any>.create { (maybe) -> Disposable in
print("maybe 是否共享")
maybe(.success("Cooci"))
maybe(.completed)
maybe(.error(NSError.init(domain: "com.lgcoooci.cn",
code: 10086, userInfo: nil)))
return Disposables.create()
}
maybeOB.subscribe { (reslut) in
print("訂閱:\(reslut)")
}.disposed(by: disposeBag)
maybeOB.subscribe { (reslut) in
print("訂閱:\(reslut)")
}.disposed(by: disposeBag)
複製代碼
這個篇章沒有太多的底層封裝,由於都是差很少的,由於篇幅關係,就沒有累贅,但願讀者認真感覺,在不那麼瞭解的狀況下,不妨本身
Demo
感覺一下特色spa就問此時此刻還有誰?45度仰望天空,該死!我這無處安放的魅力!