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)
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。