RxSwift-Driver

問題
問題一:訂閱了幾次 請求了幾次,浪費網(wǎng)絡
問題二:返回來的在子線程该园,子線程更新UI問題
問題三:錯誤事件

        let result = textFiled.rx.text.skip(1).flatMap { [weak self](input) -> Observable<Any> in
            
            return (self?.dealWithData(inputText: input ?? ""))!
        }
        
        result.subscribe(onNext: { (element) in
            print("訂閱到0:\(element)")
        })
        result.subscribe(onNext: { (element) in
            print("訂閱到1:\(element) - \(Thread.current)")
        })

    func dealWithData(inputText: String) -> Observable<Any> {
        print("請求網(wǎng)絡了 \(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()
        })
    }

請求網(wǎng)絡了 <NSThread: 0x600001325b80>{number = 1, name = main}
發(fā)送之前看看:<NSThread: 0x60000135ac00>{number = 3, name = (null)}
請求網(wǎng)絡了 <NSThread: 0x600001325b80>{number = 1, name = main}
訂閱到0:已經(jīng)輸入:
發(fā)送之前看看:<NSThread: 0x600001353240>{number = 4, name = (null)}
訂閱到1:已經(jīng)輸入: - <NSThread: 0x600001353240>{number = 4, name = (null)}

解決方案
問題一:share(replay: 1, scope: .whileConnected)
問題二:observeOn(MainScheduler.instance)
問題三:catchErrorJustReturn("檢測到了錯誤事件")

        let result = textFiled.rx.text.skip(1).flatMap { [weak self](input) -> Observable<Any> in
            
            return (self?.dealWithData(inputText: input ?? ""))!.observeOn(MainScheduler.instance).catchErrorJustReturn("檢測到了錯誤事件")
        }.share(replay: 1, scope: .whileConnected)

Driver 登場

1、請求一次網(wǎng)絡
2鹿蜀、綁定到了UI - 主線程
3庵佣、title - 非error

        let result = textFiled.rx.text.orEmpty.asDriver().flatMap {
            
            return self.dealWithData(inputText: $0).asDriver(onErrorJustReturn: "檢測到了錯誤事件")
        }

        //map 只是映射 讓它轉(zhuǎn)換一下 Observable<Any>的Any->String
        result.map { "長度:\(($0 as! String).count)" }.drive(self.label.rx.text)
//        result.drive(self.textLabel.rx.text) //需要把Observable<Any> 中的Any 改成 String
        result.map { "\($0 as! String)" }.drive(self.button.rx.title())

    func dealWithData(inputText: String) -> Observable<Any> {
        print("請求網(wǎng)絡了 \(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()
        })
    }

Driver 源碼解析

        let result = inputTF.rx.text.orEmpty.asDriver().flatMap {
            
            return self.dealWithData(inputText: $0).asDriver(onErrorJustReturn: "檢測到了錯誤事件")
        }
1.1 找observeOn(MainScheduler.instance)

1.1.1 點擊 asDriver(onErrorJustReturn: ) 中 asDriver

    public func asDriver(onErrorJustReturn: Element) -> Driver<Element> {
        let source = self
            .asObservable()
            .observeOn(DriverSharingStrategy.scheduler)
            .catchErrorJustReturn(onErrorJustReturn)
        return Driver(source)
    }

1.1.2 點擊 scheduler

public struct DriverSharingStrategy: SharingStrategyProtocol {
    public static var scheduler: SchedulerType { return SharingScheduler.make() }
    public static func share<Element>(_ source: Observable<Element>) -> Observable<Element> {
        return source.share(replay: 1, scope: .whileConnected)
    }
}

1.1.3 點擊make

    public private(set) static var make: () -> SchedulerType = { MainScheduler() }
1.2 找catchErrorJustReturn("檢測到了錯誤事件") >>>>>>>有點懵

1.2.1 點擊 asDriver()

    public func asDriver() -> Driver<Element> {
        return self.asDriver { _ -> Driver<Element> in
            #if DEBUG
                rxFatalError("Somehow driver received error from a source that shouldn't fail.")
            #else
                return Driver.empty()
            #endif
        }
    }

1.2.2 點擊 .asDriver { }

    public func asDriver(onErrorRecover: @escaping (_ error: Swift.Error) -> Driver<Element>) -> Driver<Element> {
        let source = self
            .asObservable()
            .observeOn(DriverSharingStrategy.scheduler)
            .catchError { error in
                onErrorRecover(error).asObservable()
            }
        return Driver(source)
    }
1.3 找share(replay: 1, scope: .whileConnected)

1.3.1 點擊 asDriver(onErrorJustReturn: ) 中 asDriver

    public func asDriver(onErrorJustReturn: Element) -> Driver<Element> {
        let source = self
            .asObservable()
            .observeOn(DriverSharingStrategy.scheduler)
            .catchErrorJustReturn(onErrorJustReturn)
        return Driver(source)
    }

1.3.2 點擊 Driver()

public typealias Driver<Element> = SharedSequence<DriverSharingStrategy, Element>

public struct DriverSharingStrategy: SharingStrategyProtocol {
    public static var scheduler: SchedulerType { return SharingScheduler.make() }
    public static func share<Element>(_ source: Observable<Element>) -> Observable<Element> {
        return source.share(replay: 1, scope: .whileConnected)
    }
}

1.3.3 點擊 SharedSequence
1.3.3.1、SharedSequence<DriverSharingStrategy, Element> 傳入DriverSharingStrategy
1.3.3.2婿斥、init(_ source: Observable<Element>) { self._source = SharingStrategy.share(source) } 初始化
1.3.3.3劝篷、SharingStrategy.share(source) DriverSharingStrategy執(zhí)行share方法

public struct SharedSequence<SharingStrategy: SharingStrategyProtocol, Element> : SharedSequenceConvertibleType {
    let _source: Observable<Element>

    init(_ source: Observable<Element>) {
        self._source = SharingStrategy.share(source)
    }

    /**
    - returns: Built observable sequence.
    */
    public func asObservable() -> Observable<Element> {
        return self._source
    }

    /**
    - returns: `self`
    */
    public func asSharedSequence() -> SharedSequence<SharingStrategy, Element> {
        return self
    }
}

1.3.4 點擊share 選擇DriverSharingStrategy 來到 1.3.2中的share方法

    public static func share<Element>(_ source: Observable<Element>) -> Observable<Element> {
        return source.share(replay: 1, scope: .whileConnected)
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市民宿,隨后出現(xiàn)的幾起案子娇妓,更是在濱河造成了極大的恐慌,老刑警劉巖活鹰,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哈恰,死亡現(xiàn)場離奇詭異只估,居然都是意外死亡,警方通過查閱死者的電腦和手機着绷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門蛔钙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荠医,你說我怎么就攤上這事吁脱。” “怎么了彬向?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵兼贡,是天一觀的道長。 經(jīng)常有香客問我幢泼,道長紧显,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任缕棵,我火速辦了婚禮孵班,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘招驴。我一直安慰自己篙程,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布别厘。 她就那樣靜靜地躺著虱饿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪触趴。 梳的紋絲不亂的頭發(fā)上氮发,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音冗懦,去河邊找鬼爽冕。 笑死,一個胖子當著我的面吹牛披蕉,可吹牛的內(nèi)容都是我干的颈畸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼没讲,長吁一口氣:“原來是場噩夢啊……” “哼眯娱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爬凑,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤徙缴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嘁信,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娜搂,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡迁霎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年吱抚,在試婚紗的時候發(fā)現(xiàn)自己被綠了百宇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡秘豹,死狀恐怖携御,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情既绕,我是刑警寧澤啄刹,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站凄贩,受9級特大地震影響誓军,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疲扎,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一昵时、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧椒丧,春花似錦壹甥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棒假,卻和暖如春溯职,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背帽哑。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工谜酒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祝拯。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓甚带,卻偏偏與公主長得像,于是被迫代替她去往敵國和親佳头。 傳聞我的和親對象是個殘疾皇子鹰贵,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354