自主学习之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` 中使用
自主学习之RxSwift(一) -----Driver的更多相关文章
- 自主学习之RxSwift(二) -----flatMap
最近项目中有这么一个需求,下面是三个网络请求 A.从服务器获取到时间戳(GET 方法,获取 timeLine) B.进行用户头像上传,获得回传的URL(POST方法,参数为 userId, timeL ...
- swift使用查阅资料备份3
自主学习之RxSwift(二) -----flatMap https://blog.csdn.net/chelongfei/article/details/50995603 RxSwift 系列(九) ...
- 深入linux kernel内核配置选项
============================================================================== 深入linux kernel内核配置选项 ...
- RxSwift 系列(九) -- 那些难以理解的概念
前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就 ...
- RxSwift 系列(九)
前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就 ...
- RxSwift 入门
ReactiveX 是一个库,用于通过使用可观察序列来编写异步的.基于事件的程序. 它扩展了观察者模式以支持数据.事件序列,并添加了允许你以声明方式组合序列的操作符,同时抽象对低层线程.同步.线程安全 ...
- MongoDB Java Driver操作指南
MongoDB为Java提供了非常丰富的API操作,相比关系型数据库,这种NoSQL本身的数据也有点面向对象的意思,所以对于Java来说,Mongo的数据结构更加友好. MongoDB在今年做了一次重 ...
- c#操作MangoDB 之MangoDB CSharp Driver驱动详解
序言 MangoDB CSharp Driver是c#操作mongodb的官方驱动. 官方Api文档:http://api.mongodb.org/csharp/2.2/html/R_Project_ ...
- Java JDBC Thin Driver 连接 Oracle 三种方法说明(转载)
一.JDBC 连接Oracle 说明 JDBC 的应用连接Oracle 遇到问题,错误如下: ORA-12505,TNS:listener does not currently know of SID ...
随机推荐
- 关于 CI框架访问数据库类提示Call to undefined function mysqli_init() 问题解决
我上次实践发现,安装在Win10 WampServer3.0.4集成环境,不仅打不开phpmyadmin会报错就算了,而且报错后又没提示那么解决,同时你打开php扩展配置发现,WampServer系统 ...
- MSIL实用指南-加载null、string、long、float、double等值
本篇讲述怎么加载null.string值.long值.float值.double值. 加载null不需要参数值,只要 Emit ldnull 其它几个命令要 Emit <指令> <值 ...
- sql性能优化之多表联查
先贴上我优化后的核心代码: select * into #result from ( select p.AchivementCount,isnull(a.ByAttentionCount,0) ByA ...
- mysql的下载安装
不知道为什么,写这篇文章我总是想感慨一下.首先我的感谢和敬佩那些能把知识和技术分享出来的开发者,不管你的技术是否很牛,但是你的精神让我十分敬佩.学java的已经二天了,除了问问朋友,给我最大帮助的就是 ...
- CentOS 6.4 配置 Hadoop 2.6.5
(以下所有文件:点此链接 里面还有安装的视频教学,我这里是亲测了一次,如有报错请看红色部分.实践高于理论啊兄弟们!!) 一.安装CentOS 6.4 在VMWare虚拟机上,我设置的用户是hadoop ...
- PDB调试python代码常用命令
常用命令 where(w) 找出当前代码运行位置 list(l) 显示当前代码的部分上下文 list n(line number) 显示指定行的上下文 list m, n(line number) 显 ...
- 数据处理框架:Pig
Pig pig 是基于hadoop的一个数据处理框架. MapReduce是使用java开发的.Pig有一套自己的数据处理语言.Pig的数据处理过程要转化为MR 来运行. Pig的数据处理语言是数据流 ...
- GeoJSON JS判断某一点是否在某一区域范围之内
GeoJSON JS判断某一点是否在某一区域范围之内 算法: function isInPolygon(checkPoint, polygonPoints) { var counter = 0; va ...
- PAT乙级-1041. 考试座位号(15)
每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座 ...
- centos6.x上安装Java-1.8.0
author : headsen chen date : 2017-12-04 10:32:44 notice :This article is created by headsen chen h ...