RxSwift-Driver

本文整理了一下Driver的用法
RxSwift-Driver
1、Driver 可以說是最復雜的 trait,它的?目標是提供一種簡便便 的?方式在 UI 層編寫響應式代碼。

2、如果我們的序列列滿?足如下特征,就可以使?用它:

? 不會產?生 error 事件
? 一定在主線程監聽(MainScheduler)
? 共享狀態變化(shareReplayLatestWhileConnected)

3、為什什么要使?用 Driver?
(1)Driver 最常使用的場景應該就是需要用序列來驅動應?程序的情況了,比如:

? 通過 CoreData 模型驅動 UI
? 使?用一個 UI 元素值(綁定)來驅動另一個 UI 元素值

(2)與普通的操作系統驅動程序一樣,如果出現序列列錯誤,應用程序將停止響應用戶輸?。
(3)在主線程上觀察到這些元素也是極其重要的,因為 UI 元素和應用程序邏輯通常不是線程安全的。
(4)使用構建 Driver 的可觀察的序列,它是共享狀態變化。

---對比普通用法和Driver用法---

這里模擬一個輸入文字請求網絡的需求:

    //模擬網絡請求代碼
   func dealData(inputText: String) -> Observable<Any>{
        return Observable<Any>.create({ (ob) -> Disposable in
            //模擬發出錯誤
            if inputText == "1234" {
                ob.onError(NSError(domain: "testError", code: 1001, userInfo: nil))
            }
            //異步發送信號
            DispatchQueue.global().async {
                print("模擬網絡請求返回")
                ob.onNext("輸入了:\(inputText)")
                ob.onCompleted()
            }
            return Disposables.create()
        })

創建普通序列

    //創建普通序列
        let result = textField.rx.text.orEmpty.skip(1)
            .flatMap { [weak self] (text) -> Observable<Any> in
                return (self?.dealData(inputText: text))!
                //執行訂閱時回到主線程,如果不加,執行訂閱時會在子線程
                .observeOn(MainScheduler.instance)
                    .catchErrorJustReturn("監測到錯誤")
        }
            //共享observer序列,防止多次訂閱時多次請求網絡
            .share(replay: 1, scope: .whileConnected)
        
        result.subscribe(onNext: { (value) in
            print("訂閱到:\(value)")
        }).disposed(by: disposebag)

創建Driver 序列

//創建Driver 序列
//自動共享序列,多次訂閱也只請求一次網絡
//綁定到UI,自動回到主線程
let result2 = textField.rx.text.orEmpty
        .asDriver()
            .flatMap { (text) -> Driver<Any> in
                return self.dealData(inputText: text)
                    .asDriver(onErrorJustReturn: "監測到錯誤")
        }
        result2.map { (text) -> String in
            return "綁定文字到label"
        }.drive(label.rx.text)
        .disposed(by: disposebag)
        
        result2.map{"綁定到button" + ($0 as! String)}
        .drive(button.rx.title())
        .disposed(by: disposebag)
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 問題問題一:訂閱了幾次 請求了幾次,浪費網絡問題二:返回來的在子線程,子線程更新UI問題問題三:錯誤事件 解決方案...
    Code_人生閱讀 1,001評論 2 2
  • Swift1> Swift和OC的區別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,135評論 1 32
  • 在之前的課程中,我們已經學習了進程相關的知識。進程是計算機程序被執行的一個實例(instance),一個進程可能由...
    夏威夷的芒果閱讀 927評論 0 2
  • 概述 RxSwift顧名思義是Swift的一種框架,您或許曾經聽說過「響應式編程」(Reactive Progra...
    Mr大喵喵閱讀 1,892評論 3 4
  • 簡介 小程序 toast showLoading 其實是使用同一個組件。這就導致了調用wx.hideLoading...
    鎢絲燈閱讀 1,063評論 0 0