RxSwift 系列(九) -- 那些难以理解的概念
2017-08-09 13:08
218 查看
前言
看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读。上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就行,用的时候,再来查阅一番,慢慢就掌握了。
本篇主要来深入了解一些
RxSwift实战中用到的一些重要知识点,这里面有很多自己的理解,所以不免会有一些错误的地方,还请大家多多交流,如有发现错误的地方,欢迎评论。
概念
Rx系列的核心就是
Observable Sequence这个相信大家心中已经有所了解了,这里不再啰嗦了,建议大家看看前面几篇文章去了解一下。接下来介绍一些容易混淆和难以理解的概念。
Observable 和 Observer
subscribe 和 subscribe(onNext:)
Dispose 和 DisposeBag
observeOn() 和 subscribeOn()
shareReplay
自定义operator
Driver
map 和 flatMap 何时使用
UIBindingObserver
Observable 和 Observer
相信大家看前面几篇文章的时候,大量出现这两个东西,为了理解这两个东西,我们先来简单介绍下观察者模式吧。比如一个宝宝在睡觉,爸爸妈妈不可能时时刻刻待在那看着吧?那样子太累
了。他们该做啥做啥,只要听到宝宝哭声的时候,他们给宝宝喂奶就行了。这就是一个简单的观察者模式。宝宝是被观察者,爸爸妈妈是观察者也称作订阅者,只要被观察者发出了某一个事件,比如宝宝哭声,叫声都是一个事件,订阅者就会做出相应地响应。
理解了观察者模式这两个概念就很好理解了,
Observable就是可被观察的,也就是我们说的宝宝,他也是事件源。而
Observer就是我们的观察者,也就是当收到事件的时候去做某些处理的爸爸妈妈。观察者需要去订阅(
subscribe)被观察者,才能收到
Observable的事件通知消息。
subscribe 和 subscribe(onNext:)
subscribe是订阅
sequence发出的事件,比如
next事件,
error事件等。而
subscribe(onNext:)是监听
sequence发出的
next事件中的
element进行处理,他会忽略
error和
completed事件。相对应的还有
subscribe(onError:)
和
subscribe(onCompleted:)。
Dispose 和 DisposeBag
当监听一个sequence的时候,有消息事件来了,我们做某些事情。但是这个
sequence不再发送消息事件了,那么我们的监听也就没有什么存在的价值了,所以我们需要释放我们这些监听资源,其实也就是内存资源释放。
释放某一个监听的时候,我们有两种方式处理:
我们可以手动调用释放方式,但是我们一般不适用这种方式。
// 关于scheduler,我们会在下面讲到 let subscription = Observable<Int>.interval(0.3, scheduler: SerialDispatchQueueScheduler.init(internalSerialQueueName: "scott")) .observeOn(MainScheduler.instance) //observeOn也会在下面讲到 .subscribe { event in print(event) } Thread.sleep(forTimeInterval: 2.0) subscription.dispose()
打印结果:
next(0) next(1) next(2) next(3) next(4) next(5)
比如上面这个例子,我们创建了一个
subscription监听,在两秒以后我们不需要了,手动调用
dispose()方法,就能释放监听资源,不再打印信息。上面的
subscription不论是在哪个线程中监听,就算在主线程中调用的
dispose()方法一样会销毁资源。
除了上述手动释放资源外,还有一种自动方式,推荐大家使用这种方式,这种方式就像
iOS中的
ARC,会在适当的时候销毁观察者,自动释放资源。
let disposeBag = DisposeBag() Observable<Int>.empty() .subscribe { event in print(event) } .addDisposableTo(disposeBag)
如上个例子,我们创建一个
disposeBag来盛放我们需要管理的资源,然后把新建的监听都放进去,会在适当的时候销毁这些资源。如果你需要立即释放资源只需要新建一个
4000
DisposeBag(),那么上一个
DisposeBag就会被销毁。
observeOn() 和 subscribeOn()
这两个东西刚开始看的时候也是一脸懵逼,就知道最好多用observeOn(),但是不知道为什么,下面我们就来揭开它们的面纱看下它们的真面目吧。
区别其实我感觉就一句话,
subscribeOn()设置起点在哪个线程,
observeOn()设置了后续工作在哪个线程。例如:
someObservable .doOneThing() // 1 .observeOn(MainRouteScheduler.instance) // 2 .subscribeOn(OtherScheduler.instance) // 3 .subscribeNext { // 4 ...... } .addDisposableTo(disposeBag)
所有动作都发生在当前的默认线程
observeOn()转换线程到主线程,下面所有的操作都在主线程
subscribeOn()规定动作一开始不是发生在默认线程,而是在
OtherScheduler了。
如果我们之前没有调用
observeOn(),那么这边会在
OtherScheduler发生,但是我们前面调用了
observeOn(),所以这个动作会在主线程中调用。
总结一下:
subscribeOn()只是影响事件链开始默认的线程,而
observeOn()规定了下一步动作发生在哪个线程中。
shareReplay
看官方项目里面的Demo时,我也很疑惑,为什么很多的
sequence后面都有
shareReplay(1)呢?想的昏头涨脑。
这里我就给大家讲解一下我的理解吧。先看一个例子:
let disposeBag = DisposeBag() let observable = Observable.just("
相关文章推荐
- 大型企业网络配置系列课程详解(五) --Frame-Relay配置与相关概念的理解
- javaSE_8系列博客——Java语言的特性(一)--关于面向对象基本概念的理解(2)--对象
- 大型企业网络配置系列课程详解(一)---OSPF单区域配置与相关概念的理解
- IOS开发学习笔记(二十二)——ObjectC语言难以理解的概念汇总
- 大型企业网络配置系列课程详解(七) --NAT的配置与相关概念的理解
- Amazon Alexa系列介绍(4)--相关术语和概念理解
- javascript系列学习----对象相关概念理解
- 大型企业网络配置系列课程详解(一)---OSPF单区域配置与相关概念的理解
- 大型企业网络配置系列课程详解(四) --HSRP和VRRP配置与相关概念的理解(一)
- 大型企业网络配置系列课程详解(二) --OSPF多区域配置与相关概念的理解 推荐
- Oracle 11g AWR 系列一:AWR 的基本概念理解
- Object-C难以理解的一些概念
- 实现HTTPS系列第三弹之【数字签名,数字证书,CA认证等概念理解】 推荐
- 大型企业网络配置系列课程详解(七) --NAT的配置与相关概念的理解
- 大型企业网络配置系列课程详解(四) --HSRP和VRRP配置与相关概念的理解(一)
- 平时碰到的各种感觉难以理解或者容易混淆的概念的总结-持续
- 大型企业网络配置系列课程详解(七) --NAT的配置与相关概念的理解
- 大型企业网络配置系列课程详解(六) --PPP链路的配置与相关概念的理解
- Swift相关概念语法简单理解
- rabbitmq系列(一)-基本概念理解