RxSwift-場景序列

簡化創(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")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末彤灶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子批旺,更是在濱河造成了極大的恐慌幌陕,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汽煮,死亡現(xiàn)場離奇詭異搏熄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)暇赤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門心例,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鞋囊,你說我怎么就攤上這事止后。” “怎么了溜腐?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵译株,是天一觀的道長。 經(jīng)常有香客問我挺益,道長歉糜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任望众,我火速辦了婚禮匪补,結(jié)果婚禮上伞辛,老公的妹妹穿的比我還像新娘。我一直安慰自己夯缺,他們只是感情好始锚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喳逛,像睡著了一般瞧捌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上润文,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天姐呐,我揣著相機(jī)與錄音,去河邊找鬼典蝌。 笑死曙砂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骏掀。 我是一名探鬼主播鸠澈,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼截驮!你這毒婦竟也來了笑陈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤葵袭,失蹤者是張志新(化名)和其女友劉穎涵妥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坡锡,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蓬网,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹉勒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帆锋。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖禽额,靈堂內(nèi)的尸體忽然破棺而出锯厢,到底是詐尸還是另有隱情,我是刑警寧澤绵疲,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布哲鸳,位于F島的核電站,受9級特大地震影響盔憨,放射性物質(zhì)發(fā)生泄漏徙菠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一郁岩、第九天 我趴在偏房一處隱蔽的房頂上張望婿奔。 院中可真熱鬧缺狠,春花似錦、人聲如沸萍摊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冰木。三九已至穷劈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間踊沸,已是汗流浹背歇终。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逼龟,地道東北人评凝。 一個(gè)月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像腺律,于是被迫代替她去往敵國和親奕短。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容