RxSwift-Driver

問題
問題一:訂閱了幾次 請求了幾次,浪費網絡
問題二:返回來的在子線程,子線程更新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("請求網絡了 \(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("發送之前看看:\(Thread.current)")
                ob.onNext("已經輸入:\(inputText)")
                ob.onCompleted()
            }
            return Disposables.create()
        })
    }

請求網絡了 <NSThread: 0x600001325b80>{number = 1, name = main}
發送之前看看:<NSThread: 0x60000135ac00>{number = 3, name = (null)}
請求網絡了 <NSThread: 0x600001325b80>{number = 1, name = main}
訂閱到0:已經輸入:
發送之前看看:<NSThread: 0x600001353240>{number = 4, name = (null)}
訂閱到1:已經輸入: - <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、請求一次網絡
2、綁定到了UI - 主線程
3、title - 非error

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

        //map 只是映射 讓它轉換一下 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("請求網絡了 \(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("發送之前看看:\(Thread.current)")
                ob.onNext("已經輸入:\(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執行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)
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。