zoukankan      html  css  js  c++  java
  • 自主学习之RxSwift(一) -----Driver

    对于RxSwift,我也是初学者,此系列来记录我学习RxSwift的历程!

    (一)

    想必关于Drive大家一定在RxSwift的Demo中看到过,也一定有些不解,抱着一起学习的态度,来了解一下Driver

    首先列举一下官方的例子:(我会加上注释方便理解)

    此例子的场景大概就是,根据一个输入框的关键字,来请求数据,然后接结果绑定到另一个Label,和TableView中

    ### Practical usage example

    This is an typical beginner example.//这是一个典型的初学者的例子


    ```swift

    let results = query.rx_text

        .throttle(0.3, scheduler: MainScheduler.instance) //在主线程中操作,如果0.3秒内值发生多次改变,去最后一次的值

        .flatMapLatest { query in //筛选出空值, 拍平序列,并取得最后一个有效的值(个人理解,不一定对,希望指教)

            fetchAutoCompleteItems(query)

        }


    results

        .map { "($0.count)" } //得出结果之后,取出结果的数量

        .bindTo(resultCount.rx_text)//取出结果的数量,绑定到resultCount上面显示出来

        .addDisposableTo(disposeBag)//释放资源


    results

        .bindTo(resultsTableView.rx_itemsWithCellIdentifier("Cell")) { (_, result, cell) in

            cell.textLabel?.text = "(result)" //取出结果,TableView的Cell上面显示出来

        }

        .addDisposableTo(disposeBag)//释放资源


    但是这样做的话,会有几个问题:

    1.如果fetchAutoCompleteItems错误(连接失败,参数错误等),错误将会丢失(得不到任何处理),UI也不会再处理和响应任何的结果

    2.如果fetchAutoCompleteItems返回的结果不是在主线程,那么不在子线程中对UI进行绑定,就会出现未知的错误

    3.返回的结果绑定到了两个UI上,那么意味着每一个UI都要进行一次网络请求,即进行两次网络请求,那么,我们可以稍稍修改一下

    A more appropriate version of the code would look like this://一个更好的版本是这样的


    ```swift

    let results = query.rx_text

        .throttle(0.3, scheduler: MainScheduler.instance)

        .flatMapLatest { query in

            fetchAutoCompleteItems(query)

                .observeOn(MainScheduler.instance) // 将返回结果切换到到主线程上

                .catchErrorJustReturn([])                // 如果有问题,错误结果将会得到处理

        }

        .shareReplay(1)                                  // HTTP请求将会得到分享,即两次绑定UI使用同一网络请求

                                                         // to all UI elements


    results

        .map { "($0.count)" }

        .bindTo(resultCount.rx_text)

        .addDisposableTo(disposeBag)


    results

        .bindTo(resultTableView.rx_itemsWithCellIdentifier("Cell")) { (_, result, cell) in

            cell.textLabel?.text = "(result)"

        }

        .addDisposableTo(disposeBag)

    ```

    这样就好了嘛?但是还有更好的方式去解决这个问题,那么就是我们的主角,Driver!


    ```swift

    let results = query.rx_text.asDriver()        // This converts normal sequence into `Driver` sequence.

        .throttle(0.3, scheduler: MainScheduler.instance)

        .flatMapLatest { query in

            fetchAutoCompleteItems(query)

                .asDriver(onErrorJustReturn: [])  // Builder just needs info what to return in case of error.

        }


    results

        .map { "($0.count)" }

        .drive(resultCount.rx_text)               // If there is `drive` method available instead of `bindTo`,

        .addDisposableTo(disposeBag)              // that means that compiler has proved all properties

                                                  // are satisfied.

    results

        .drive(resultTableView.rx_itemsWithCellIdentifier("Cell")) { (_, result, cell) in

            cell.textLabel?.text = "(result)"

        }

        .addDisposableTo(disposeBag)

    ```

    那么他究竟做了什么,有什么变化呢?

    1.asDriver 将‘ControlProperty’ 转换成了 ‘Driver’ (

    ```swift

    query.rx_text.asDriver()

    ```

    )

    'Driver'拥有'ControlProperty'的所有属性,同时又增加了很多属性


    2.

    ```swift

      .asDriver(onErrorJustReturn: [])

    ```

    任何 'Observable' 序列都可以被转换为'Driver', 只要他满足一下三点:

    1.不能出错   2.观察主线程  3.共享资源

    如何确保这些属性都满足呢?只需要使用 'asDriver(onErrorJustReturn: [])' ,相当于如下代码:

    ```

    let safeSequence = xs

      .observeOn(MainScheduler.instance) // 切换到主线程

      .catchErrorJustReturn(onErrorJustReturn) // 不能出错

      .shareReplayLatestWhileConnected         // 共享资源

    return Driver(raw: safeSequence)           // 返回

    ```

    最后一点要说明的是 'driver' 可以代替'bindTo'

    `drive` 只能在 `Driver` 中使用 






  • 相关阅读:
    history对象
    排序算法总结
    Boltzmann机
    Sort Colors
    First Missing Positive
    Sort List
    Insertion Sort List
    Merge Two Sorted Lists
    Merge Sorted Array
    Sum Root to Leaf Numbers
  • 原文地址:https://www.cnblogs.com/melons/p/5791970.html
Copyright © 2011-2022 走看看