RxSwift<7> —— 場景序列總結

ControlEvent
ControlEvent:專門描述UI控件所產(chǎn)生的事件:

  • 不會產(chǎn)生error
  • 一定在MainScheduler訂閱
  • 一定在MainScheduler監(jiān)聽
  • 會共享附加作用
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響應事件,不會存在失敗響應

binder

  • 不會處理錯誤事件
  • 確保幫頂給定Scheduler上執(zhí)行(默認MainSchedluer)
  • 一旦產(chǎn)生錯誤事件,在調試環(huán)境下將執(zhí)行fatalError,發(fā)布環(huán)境下打印錯誤信息
let observer : AnyObserver<Bool> = AnyObserver { (event) in
    print("observer當前線程:\(Thread.current)")
    switch event{
    case .next(let isHidden) :
        print("來了,請看label的狀態(tài)")
        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)

Driver
主要是為了簡化 UI 層的代碼。不過如果你遇到的序列具有以下特征:

  • 不會產(chǎn)生error事件
  • 一定在MainSchedluer監(jiān)聽
  • 會共享附加作用
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)序列狀態(tài)共享
  • catchErrorJustReturn(onErrorJustReturn) 保證了無錯誤信號
  • observeOn(DriverSharingStrategy.scheduler)保證了調度環(huán)境在主線程
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容