前言

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

本篇主要来深入了解一些RxSwift实战中用到的一些重要知识点,这里面有很多自己的理解,所以不免会有一些错误的地方,还请大家多多交流,如有发现错误的地方,欢迎评论。

概念

Rx系列的核心就是Observable Sequence这个相信大家心中已经有所了解了,这里不再啰嗦了,建议大家看看前面几篇文章去了解一下。接下来介绍一些容易混淆和难以理解的概念。

Observable 和 Observer

相信大家看前面几篇文章的时候,大量出现这两个东西,为了理解这两个东西,我们先来简单介绍下观察者模式吧。

比如一个宝宝在睡觉,爸爸妈妈不可能时时刻刻待在那看着吧?那样子太累
了。他们该做啥做啥,只要听到宝宝哭声的时候,他们给宝宝喂奶就行了。这就是一个简单的观察者模式。宝宝是被观察者,爸爸妈妈是观察者也称作订阅者,只要被观察者发出了某一个事件,比如宝宝哭声,叫声都是一个事件,订阅者就会做出相应地响应。

理解了观察者模式这两个概念就很好理解了,Observable就是可被观察的,也就是我们说的宝宝,他也是事件源。而Observer就是我们的观察者,也就是当收到事件的时候去做某些处理的爸爸妈妈。观察者需要去订阅(subscribe)被观察者,才能收到Observable的事件通知消息。

subscribe 和 subscribe(onNext:)

subscribe是订阅sequence发出的事件,比如next事件,error事件等。而subscribe(onNext:)是监听sequence发出的next事件中的element进行处理,他会忽略errorcompleted事件。相对应的还有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来盛放我们需要管理的资源,然后把新建的监听都放进去,会在适当的时候销毁这些资源。如果你需要立即释放资源只需要新建一个DisposeBag(),那么上一个DisposeBag就会被销毁。

observeOn() 和 subscribeOn()

这两个东西刚开始看的时候也是一脸懵逼,就知道最好多用observeOn(),但是不知道为什么,下面我们就来揭开它们的面纱看下它们的真面目吧。

区别其实我感觉就一句话,subscribeOn()设置起点在哪个线程,observeOn()设置了后续工作在哪个线程。例如:

someObservable
.doOneThing() // 1
.observeOn(MainRouteScheduler.instance) // 2
.subscribeOn(OtherScheduler.instance) // 3
.subscribeNext { // 4
......
}
.addDisposableTo(disposeBag)
  1. 所有动作都发生在当前的默认线程
  2. observeOn()转换线程到主线程,下面所有的操作都在主线程
  3. subscribeOn()规定动作一开始不是发生在默认线程,而是在OtherScheduler了。
  4. 如果我们之前没有调用observeOn(),那么这边会在OtherScheduler发生,但是我们前面调用了observeOn(),所以这个动作会在主线程中调用。

总结一下:subscribeOn()只是影响事件链开始默认的线程,而observeOn()规定了下一步动作发生在哪个线程中。

shareReplay

看官方项目里面的Demo时,我也很疑惑,为什么很多的sequence后面都有shareReplay(1)呢?想的昏头涨脑。
这里我就给大家讲解一下我的理解吧。先看一个例子:

let disposeBag = DisposeBag()

let observable = Observable.just("												

RxSwift 系列(九)的更多相关文章

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

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

  2. RxSwift 系列(三) -- Combination Operators

    RxSwift 系列(三) -- Combination Operators 前言 本篇文章将要学习如何将多个Observables组合成一个Observable. Combination Opera ...

  3. java基础解析系列(九)---String不可变性分析

    java基础解析系列(九)---String不可变性分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---In ...

  4. java多线程系列(九)---ArrayBlockingQueue源码分析

    java多线程系列(九)---ArrayBlockingQueue源码分析 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 j ...

  5. 分布式系列九: kafka

    分布式系列九: kafka概念 官网上的介绍是kafka是apache的一种分布式流处理平台. 最初由Linkedin开发, 使用Scala编写. 具有高性能,高吞吐量的特定. 包含三个关键能力: 发 ...

  6. information_schema系列九

    information_schema系列九   1:INNODB_SYS_FOREIGN 这个表存储的是INNODB关于外键的元数据信息 Column name Description ID 外键的名 ...

  7. RxSwift 系列(三)

    RxSwift 系列(三) -- Combination Operators 前言 本篇文章将要学习如何将多个Observables组合成一个Observable.Combination Operat ...

  8. struts2官方 中文教程 系列九:Debugging Struts

    介绍 在Struts 2 web应用程序的开发过程中,您可能希望查看由Struts 2框架管理的信息.本教程将介绍两种工具,您可以使用它们来查看.一个工具是Struts 2的配置插件,另一个是调试拦截 ...

  9. Bing Maps进阶系列九:使用MapCruncher进行地图切片并集成进Bing Maps

    Bing Maps进阶系列九:使用MapCruncher进行地图切片并集成进Bing Maps 在Bing Maps开发中,由于各种应用功能的不同,更多的时候用户可能需要将自己的一部分图片数据作为地图 ...

随机推荐

  1. How to Evaluate Machine Learning Models, Part 4: Hyperparameter Tuning

    How to Evaluate Machine Learning Models, Part 4: Hyperparameter Tuning In the realm of machine learn ...

  2. hbase性能调优案例

    hbase性能调优案例 1.人员-角色   人员有多个角色  角色优先级   角色有多个人员   人员 删除添加角色   角色 可以添加删除人员   人员 角色 删除添加   设计思路 person表 ...

  3. APP版本号记录

    VoLTE版本: VT_BV0800V1.0.0B06 800M版本: NETARTIST_BV0800V1.0.0B01 看详细版本号:9831275#

  4. html中去掉文本框(input type="text")的边框或只显示下边框

    去掉: <input   type="text"   name="textfield"   style="border:0px;"&g ...

  5. opencv配置过程 (cmake,vs2013,qt 5.4)

    平台及软件: Windows 7 X86 Visual Studio 2013 OpenCV3.0.0 Cmake3.3 1.下载Windows下的安装文件OpenCV-3.0.0.exe,解压,选择 ...

  6. 5.Python3标准库-日期和时间

    ''' 不同于int,str,float,Python没有包含对应日期和时间的原生类型,不过提供了3个相应的模块,可以采用多种表示来管理日期和时间值 time模块由底层C库提供与时间相关的函数.它包含 ...

  7. IDE按住ctrl 打开单元 无效时 的方法

    一般打开单元无效时 是由于程序有错误,若程序没有错误 可以重新build一下 再试. 若实在不行 就右键---open at cursor

  8. HDU 2147 kiki's game(博弈图上找规律)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2147 题目大意:给你一个n*m的棋盘,初始位置为(1,m),两人轮流操作,每次只能向下,左,左下这三个 ...

  9. Kiggle:Digit Recognizer

    题目链接:Kiggle:Digit Recognizer Each image is 28 pixels in height and 28 pixels in width, for a total o ...

  10. Jmeter组件和属性(二)

    Jmeter脚本开发原则 简单.正确.高效.简单:去除无关的组件,同时能复用的尽量复用.正确:对脚本或者业务正确性进行必要的判断,不能少也不能多.(200),业务错误的情况下,也可能返回200,必须用 ...