RxSwift学习笔记2:Observable/生命周期/Event/oneNext/onError/onCompleted/
Observable 是 Rx 的根基
github地址:https://github.com/ReactiveX/RxSwift

- Observable<T> 这个类就是 Rx 框架的基础,我们可以称它为可观察序列。它的作用就是可以异步地产生一系列的 Event(事件),即一个 Observable<T> 对象会随着时间推移不定期地发出 event(element : T) 这样一个东西。
- 而且这些 Event 还可以携带数据,它的泛型 <T> 就是用来指定这个 Event 携带的数据的类型。
- 有了可观察序列,我们还需要有一个 Observer(订阅者)来订阅它,这样这个订阅者才能收到 Observable<T> 不时发出的 Event。
查看 RxSwift 源码可以发现,事件 Event 的定义如下:
public enum Event<Element> {
/// Next element is produced.
case next(Element)
/// Sequence terminated with an error.
case error(Swift.Error)
/// Sequence completed successfully.
case completed
}
官方文档如下:
onNext:- An Observable calls this method whenever the Observable emits an item. This method takes as a parameter the item emitted by the Observable.
- next 事件就是那个可以携带数据 <T> 的事件,可以说它就是一个“最正常”的事件。
onError:
- An Observable calls this method to indicate that it has failed to generate the expected data or has encountered some other error. It will not make further calls to
onNextoronCompleted. TheonErrormethod takes as its parameter an indication of what caused the error. -
error 事件表示一个错误,它可以携带具体的错误内容,一旦 Observable 发出了 error event,则这个 Observable 就等于终止了,以后它再也不会发出 event 事件了。
onCompleted:- An Observable calls this method after it has called
onNextfor the final time, if it has not encountered any errors. -
completed 事件表示 Observable 发出的事件正常地结束了,跟 error 一样,一旦 Observable 发出了 completed event,则这个 Observable 就等于终止了,以后它再也不会发出 event 事件了。
/*
(1)该方法通过传入一个默认值来初始化。
(2)下面样例我们显式地标注出了 observable 的类型为 Observable<Int>,
即指定了这个 Observable 所发出的事件携带的数据类型必须是 Int 类型的。
*/
let justObservable = Observable<Int>.just(5)
/*
(1)该方法可以接受可变数量的参数(必需要是同类型的)
(2)下面样例中我没有显式地声明出 Observable 的泛型类型,Swift 也会自动推断类型。
*/
let ofObservable = Observable.of("a","b","c")
/*
(1)该方法需要一个数组参数。
(2)下面样例中数据里的元素就会被当做这个 Observable 所发出 event 携带的数据内容,最终效果同上面饿 of() 样例是一样的。
*/
let fromObservable = Observable.from(["a","b","c"])
//该方法创建一个永远不会发出 Event(也不会终止)的 Observable 序列。
let emptyObservable = Observable<Int>.never() //该方法创建一个不做任何操作,而是直接发送一个错误的 Observable 序列。
enum Myerro:Error{
case A
case B
}
let erroObservable = Observable<Int>.error(Myerro.A)
/*
(1)该方法通过指定起始和结束数值,创建一个以这个范围内所有值作为初始值的 Observable 序列。
(2)下面样例中,两种方法创建的 Observable 序列都是一样的。
*/
let rangeAbservale = Observable.range(start: 1, count: 5)
let ofObservale = Observable.of(1,2,3,4,5)
//该方法创建一个可以无限发出给定元素的 Event 的 Observable 序列(永不终止)。
let repeatElementObservale = Observable.repeatElement(1) /*
(1)该方法创建一个只有当提供的所有的判断条件都为 true 的时候,才会给出动作的 Observable 序列。
(2)下面样例中,两种方法创建的 Observable 序列都是一样的。
*/
let generrateObserval = Observable.generate(initialState: 0,
condition: {$0 <= 10},
iterate: {$0 + 2})
let ofObservale1 = Observable<Int>.of(1,2,4,6,8,10)
/*
(1)该方法接受一个 block 形式的参数,任务是对每一个过来的订阅进行处理。
(2)下面是一个简单的样例。为方便演示,这里增加了订阅相关代码。
*/
//这个block有一个回调参数observer就是订阅这个Observable对象的订阅者
//当一个订阅者订阅这个Observable对象的时候,就会将订阅者作为参数传入这个block来执行一些内容
let creatObservale = Observable<String>.create { observer in
//对订阅者发出了.next事件,且携带了一个数据"hangge.com"
observer.onNext("mapanguan")
//对订阅者发出了.completed事件
observer.onCompleted()
//因为一个订阅行为会有一个Disposable类型的返回值,所以在结尾一定要returen一个Disposable
return Disposables.create()
} creatObservale.subscribe{
print($0)
} /*
(1)该个方法相当于是创建一个 Observable 工厂,通过传入一个 block 来执行延迟 Observable 序列创建的行为,而这个 block 里就是真正的实例化序列对象的地方。
(2)下面是一个简单的演示样例:
*/ var isOdd = true
//使用deferred()方法延迟Observable序列的初始化,通过传入的block来实现Observable序列的初始化并且返回。
let deferredObserval = Observable<Int>.deferred { () -> Observable<Int> in
//让每次执行这个block时候都会让奇、偶数进行交替
isOdd = !isOdd
if isOdd{
return Observable.of(1,3,5,7,9)
}else{
return Observable.of(2,4,6,8,10)
}
} deferredObserval.subscribe { (event) in
print("frist",event)
} deferredObserval.subscribe { (event) in
print("second",event)
} /*
(1)这个方法创建的 Observable 序列每隔一段设定的时间,会发出一个索引数的元素。而且它会一直发送下去。
(2)下面方法让其每 1 秒发送一次,并且是在主线程(MainScheduler)发送。
*/
let intervalObserval = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
intervalObserval.subscribe { (event) in
print(event)
} //这个方法有两种用法,一种是创建的 Observable 序列在经过设定的一段时间后,产生唯一的一个元素。相当于repeat = false
let timerObserval = Observable<Int>.timer(5, scheduler: MainScheduler.instance)
timerObserval.subscribe { (event) in
print(event)
}
//另一种是创建的 Observable 序列在经过设定的一段时间后,每隔一段时间产生一个元素。相当于repeat = true
let timer2Observal = Observable<Int>.timer(5, period: 1, scheduler: MainScheduler.instance)
timer2Observal.subscribe { (event) in
print(event)
}
RxSwift学习笔记2:Observable/生命周期/Event/oneNext/onError/onCompleted/的更多相关文章
- RxSwift学习笔记3:生命周期/订阅
有了 Observable,我们还要使用 subscribe() 方法来订阅它,接收它发出的 Event. let observal = Observable.of("a",&qu ...
- MAVEN学习笔记之Maven生命周期和插件简介(3)
MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立. clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所 ...
- IOS学习笔记37——ViewController生命周期详解
在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它.ViewContro ...
- Maven学习笔记(六):生命周期与插件
何为生命周期: Maven的生命周期就是为了对全部的构建过程进行抽象和统一.Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完好的.易扩展的生命周期.这个生命周期包括了项目的清 ...
- Spring4学习笔记 - Bean的生命周期
1 Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1)通过构造器或工厂方法创建 Bean 实例 2)为 Bean 的属性设置值和对其他 Bean 的引用 3)调用 Bean 的初 ...
- Android之Fragment学习笔记②(Fragment生命周期)
一. Fragment生命周期图 二.Fragment生命周期方法介绍 Fragment的生命周期和activity生命周期很像,其生 ...
- android学习笔记28——Activity生命周期
Activity生命周期 Activity的活动状态由android已Activity栈的形式管理,当前活动的Activity位于栈顶.随着不同应用的运行,每个Activity都有可能从活动状态转入非 ...
- Android学习笔记:Activity生命周期详解
进行android的开发,必须深入了解Activity的生命周期.而对这个讲述最权威.最好的莫过于google的开发文档了. 本文的讲述主要是对 http://developer.android.co ...
- ios学习笔记之UIViewControl生命周期
提到UIViewcontrol,每个人都不会陌生吧!平时实际开发中,每天的实际开发应该都少不了它.学过android的各位亲,也对生命周期这四个字并不陌生,无论是activity,还是service, ...
随机推荐
- C++点和箭头操作符用法区别
变量是对象的时候用“.”访问 变量是对象指针的时候用“->”访问 例: #inlclude <iostream> using namespace std; class A { pub ...
- Vue修饰符
为了方便大家写代码,vue.js给大家提供了很多方便的修饰符,比如我们经常用到的取消冒泡,阻止默认事件等等~ 目录 表单修饰符 事件修饰符 鼠标按键修饰符 键值修饰符 v-bind修饰符(实在不知道叫 ...
- STL基础1:vector
#include <iostream> #include <vector> #include <algorithm> #include <numeric> ...
- tomcat+servlet例子
在C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\app\WEB-INF文件夹下建立文件夹classes. 在C:\Pro ...
- 使用vmware安装ubuntu不能上网
桌面版的话,进入桌面后还可以配置,服务版,我是在安装过程中提示的网络配置时候按照下面的方法手动配置的 安装虚拟机时候要安装网络服务,有的虚拟机在安装过程中可能已经安装好了,主机保持VMware NAT ...
- ubuntu配置ftp server
ubuntu配置ftp server 1. 安装vsftpd sudo apt-get install vsftpd 安装后会自动新建一个用户ftp,密码ftp,作为匿名用户登录的默认用户 sud ...
- spring jpetstore研究入门(zz)
spring jpetstore研究入门 分类: java2008-12-21 23:25 561人阅读 评论(2) 收藏 举报 springstrutsibatissearchweb框架servle ...
- SyntaxError: missing ; before statement
做分页功能,遇到了很坑的事情.前台一直报错:SyntaxError: missing ; before statement 最后发现解决办法是eval("("+s+")& ...
- 2017/2/12:springMVC的简单文件上传跟拦截器
1.写文件上传的界面jsp代码如下重点为文件上传标签的类型 2.写登录成功跟失败的界面:成功自己写 3.写springMVC的文件上传的controller的方法 4.最后一步配置spring-ser ...
- 网上流行的linux内核漫画