簡化創(chuàng)建流程
簡化訂閱流程
ControlEvent
- ControlEvent: 專門用于描述 UI 控件所產(chǎn)生的事件镜硕,它具有以下特征
- 不會產(chǎn)生 error 事件
- 一定在 MainScheduler 訂閱(主線程訂閱)
- 一定在 MainScheduler 監(jiān)聽(主線程監(jiān)聽)
- 會共享附加作用
let controlEventOB = self.button.rx.controlEvent(.touchUpInside)
controlEventOB.subscribe { (result) in
print("訂閱:\(result) \(Thread.current)")
}.disposed(by: self.disposeBag)
controlEventOB.subscribe { (result) in
print("訂閱:\(result) \(Thread.current)")
}.disposed(by: self.disposeBag)
訂閱:next(()) <NSThread: 0x600001920bc0>{number = 1, name = main}
訂閱:next(()) <NSThread: 0x600001920bc0>{number = 1, name = main}
Binder
- 簡化訂閱流程
- 不會處理錯(cuò)誤事件
- 確保綁定都是在給定 Scheduler 上執(zhí)行(默認(rèn) MainScheduler)
- 一旦產(chǎn)生錯(cuò)誤事件运翼,在調(diào)試環(huán)境下將執(zhí)行 fatalError,在發(fā)布環(huán)境下將打印錯(cuò)誤信息兴枯。
// let observer: AnyObserver<Bool> = AnyObserver{ (event) in
// print("observer 當(dāng)前線程:\(Thread.current)")
// switch event {
// case .next(let value):
// self.label.isHidden = value
// break
// case .error(let error):
// print("observer error:\(error)")
// break
// case .completed:
// print("完成了")
// break
// }
// }
let binder = Binder<Bool>(self.label) { (lab, value) in
print("Binder 當(dāng)前線程:\(Thread.current)")
lab.isHidden = value
}
let observable = Observable<Bool>.create { (ob) -> Disposable in
ob.onNext(true)
// ob.onError(NSError.init(domain: "com.imefuture.cn", code: 10090, 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)
Driver
- Driver 是一個(gè)精心準(zhǔn)備的特征序列血淌。它主要是為了簡化 UI 層的代碼。不過如果你遇到的序列具有以下特征财剖,你也可以使用它:
- 不會產(chǎn)生 error 事件
- 一定在 MainScheduler 監(jiān)聽(主線程監(jiān)聽)
- 會共享附加作用
let result = self.textFiled.rx.text.orEmpty
.asDriver() //普通序列轉(zhuǎn)化為
.throttle(.milliseconds(500))
.flatMap {
self.dealWithData(inputText: $0)
.asDriver(onErrorJustReturn: "檢測到了錯(cuò)誤")
}
result.map { "長度:\(($0 as! String).count)"}
.drive(self.label.rx.text)
.disposed(by: disposeBag)
result.map { ($0 as! String) }
.drive(self.button.rx.title())
.disposed(by: disposeBag)
func dealWithData(inputText: String) -> Observable<Any> {
print("請求網(wǎng)絡(luò)了 \(Thread.current)")
return Observable<Any>.create({ (ob) -> Disposable in
if inputText == "1234" {
ob.onError(NSError.init(domain: "com.dyz.cn", code: 2019, userInfo: nil))
}
DispatchQueue.global().async {
print("發(fā)送之前看看:\(Thread.current)")
ob.onNext("已經(jīng)輸入:\(inputText)")
ob.onCompleted()
}
return Disposables.create()
})
}
Signal
- Signal 和 Driver 相似悠夯,唯一的區(qū)別是,Driver 會對新觀察者回放(重新發(fā)送)上一個(gè)元素躺坟,而 Signal 不會對新觀察者回放上一個(gè)元素沦补。
- 這個(gè)demo運(yùn)行 label 是有值的,但是對于我們的新的觀察者btn是沒有值
- 不會產(chǎn)生 error 事件
- 一定在 MainScheduler 監(jiān)聽(主線程監(jiān)聽)
- 會共享附加作用
let result = self.textFiled.rx.text.orEmpty
.asSignal(onErrorJustReturn: "沒有值")
.throttle(.milliseconds(500))
.flatMap {
self.dealWithData(inputText: $0 )
.asSignal(onErrorJustReturn: "檢測到了錯(cuò)誤")
}
result.map { "長度:\(($0 as! String).count)" }
.emit(to: self.label.rx.text)
.disposed(by: disposeBag)
result.map { ($0 as! String) }
.emit(to: self.button.rx.title())
.disposed(by: disposeBag)
Single
- Single 是 Observable 的另外一個(gè)版本。不像 Observable 可以發(fā)出多個(gè)元素咪橙,它要么只能發(fā)出一個(gè)元素夕膀,要么產(chǎn)生一個(gè) error 事件虚倒。
- 發(fā)出一個(gè)元素,或一個(gè) error 事件
- 不會共享附加作用
let singleOB = Single<Any>.create { (single) -> Disposable in
print("singleOB 是否共享")
single(.success("Dyz"))
single(.success("Hello"))
single(.error(NSError.init(domain: "com.ime.cn", code: 098, userInfo: nil)))
return Disposables.create()
}
singleOB.subscribe { (result) in
print("訂閱:\(result)")
}.disposed(by: self.disposeBag)
singleOB.subscribe { (result) in
print("訂閱:\(result)")
}.disposed(by: self.disposeBag)
singleOB 是否共享
訂閱:success("Dyz")
singleOB 是否共享
訂閱:success("Dyz")
Completable
- Completable 是 Observable 的另外一個(gè)版本产舞。不像 Observable 可以發(fā)出多個(gè)元素魂奥,它要么只能產(chǎn)生一個(gè) completed 事件,要么產(chǎn)生一個(gè) error 事件
- 發(fā)出零個(gè)元素
- 發(fā)出一個(gè) completed 元素易猫,或一個(gè) error 事件
- 不會共享附加作用
- Completable 適用于那種你只關(guān)心任務(wù)是否完成耻煤,而不需要在意任務(wù)返回值的情況。它和 Observable<Void> 有點(diǎn)相似准颓。
let completableOB = Completable.create { (completable) -> Disposable in
print("completableOB 是否共享")
completable(.completed)
completable(.error(NSError.init(domain: "com.ime.cn", code: 909, userInfo: nil)))
return Disposables.create()
}
completableOB.subscribe { (result) in
print("訂閱:\(result)")
}.disposed(by: disposeBag)
completableOB.subscribe { (result) in
print("訂閱:\(result)")
}.disposed(by: disposeBag)
completableOB 是否共享
訂閱:completed
completableOB 是否共享
訂閱:completed
Maybe
- Maybe 是 Observable 的另外一個(gè)版本哈蝇。它介于 Single 和 Completable 之間,它要么只能發(fā)出一個(gè)元素攘已,要么產(chǎn)生一個(gè) completed 事件炮赦,要么產(chǎn)生一個(gè) error 事件。
- 發(fā)出一個(gè)元素或者一個(gè) completed 事件或者一個(gè) error 事件
- 不會共享附加作用
- 如果你遇到那種可能需要發(fā)出一個(gè)元素贯被,又可能不需要發(fā)出時(shí)眼五,就可以使用 Maybe。
let maybeOB = Maybe<Any>.create { (maybe) -> Disposable in
print("maybeOB 是否共享")
maybe(.success("dyz"))
maybe(.completed)
maybe(.error(NSError.init(domain: "com.ime.cn", code: 89, userInfo: nil)))
return Disposables.create()
}
maybeOB.subscribe { (result) in
print("訂閱:\(result)")
}.disposed(by: disposeBag)
maybeOB.subscribe { (result) in
print("訂閱:\(result)")
}.disposed(by: disposeBag)
maybeOB 是否共享
訂閱:success("dyz")
maybeOB 是否共享
訂閱:success("dyz")