对于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` 中使用

自主学习之RxSwift(一) -----Driver的更多相关文章

  1. 自主学习之RxSwift(二) -----flatMap

    最近项目中有这么一个需求,下面是三个网络请求 A.从服务器获取到时间戳(GET 方法,获取 timeLine) B.进行用户头像上传,获得回传的URL(POST方法,参数为 userId, timeL ...

  2. swift使用查阅资料备份3

    自主学习之RxSwift(二) -----flatMap https://blog.csdn.net/chelongfei/article/details/50995603 RxSwift 系列(九) ...

  3. 深入linux kernel内核配置选项

    ============================================================================== 深入linux kernel内核配置选项 ...

  4. RxSwift 系列(九) -- 那些难以理解的概念

    前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就 ...

  5. RxSwift 系列(九)

    前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就 ...

  6. RxSwift 入门

    ReactiveX 是一个库,用于通过使用可观察序列来编写异步的.基于事件的程序. 它扩展了观察者模式以支持数据.事件序列,并添加了允许你以声明方式组合序列的操作符,同时抽象对低层线程.同步.线程安全 ...

  7. MongoDB Java Driver操作指南

    MongoDB为Java提供了非常丰富的API操作,相比关系型数据库,这种NoSQL本身的数据也有点面向对象的意思,所以对于Java来说,Mongo的数据结构更加友好. MongoDB在今年做了一次重 ...

  8. c#操作MangoDB 之MangoDB CSharp Driver驱动详解

    序言 MangoDB CSharp Driver是c#操作mongodb的官方驱动. 官方Api文档:http://api.mongodb.org/csharp/2.2/html/R_Project_ ...

  9. Java JDBC Thin Driver 连接 Oracle 三种方法说明(转载)

    一.JDBC 连接Oracle 说明 JDBC 的应用连接Oracle 遇到问题,错误如下: ORA-12505,TNS:listener does not currently know of SID ...

随机推荐

  1. CF#462 div1 D:A Creative Cutout

    CF#462 div1 D:A Creative Cutout 题目大意: 原网址戳我! 题目大意: 在网格上任选一个点作为圆中心,然后以其为圆心画\(m\)个圆. 其中第\(k\)个圆的半径为\(\ ...

  2. 内嵌tomcat启动速度慢

    项目上最近要把内置的jetty换成tomcat, 来更好的支持servlet 3.0 本来以为换个容器, 几十行代码就好了. 实际上换了tomcat后, 一开始启动tomcat, 非常的慢. jett ...

  3. Win10下Ubuntu bash上手

    第一次发表博客,可能写的不是很好,希望大家谅解! 今天咱们来上手一下Windows10下的bash,首先这款bash是基于Ubuntu操作系统的一个移植,也是方便开发和学习Linux中的shell命令 ...

  4. PHP+MySQL分页原理实现

    功能简介:包含上一页.下一页.首页.尾页.跳转页面等功能. 编码寄语:化繁为简,则豁然开朗. 运行截图: 关键步骤: 创建数据库 CREATE TABLE `page` ( `ID` ) NOT NU ...

  5. dva.js 用法总结

    dva.js是阿里前端团队开发的一个基于react.redux.webpack的一个前端框架,他能够实现react-redux-webpack环境一键部署,能帮前端工程师节省不少环境搭建的时间.而且经 ...

  6. 8086的分段寻址技术学习总结(Segmented Addressing)

    计算机最小粒度的数据单位是bit,但是为每个bit都分配地址不仅浪费资源,同时存取效率低.因此转而用8bits(也就是1个字节,1byte)来占用一个地址. 那么16位的地址线能够访问的地址空间大小为 ...

  7. 解析Visual C# 7.2中的private protected访问修饰符

    去年12月份,随着Visual Studio 2017 Update 15.5的发布,Visual C#迎来了它的最新版本:7.2. 在这个版本中,有个让人难以理解的新特性,就是private pro ...

  8. DIY福音:Firefox菜单及右键菜单ID大全

    每一个折腾Firefox的Diyer都是上辈子折翼的天使,致自己! 打磨Firefox界面的时候最多的就隐藏一些平常根本用不上的一些菜单,常规的做法就是安装DOM Inspector扩展右键查找大法寻 ...

  9. 【django之分页器】

    一.什么是分页功能 二.Django的分页器(paginator) 语法: paginator = Paginator(book_list, 8) #8条一页print("count:&qu ...

  10. 记录一则enq: TX - row lock contention的分析过程

    故障描述:与客户沟通,初步确认故障范围大概是在上午的8:30-10:30之间,反应故障现象是Tomcat的连接数满导致应用无法连接,数据库alert中无明显报错,需要协助排查原因. 1.导入包含故障时 ...