Observable - 可监听序列
public enum Event<Element> {
case next(Element)
case error(Swift.Error)
case completed
}
一:Single - 发出一个元素,或者一个error事件;不会共享附加作用;可以通过 .create 创建
public enum SingleEvent<Element> {
case success(Element)
case error(Swift.Error)
}
二:Completable - 发出0个元素,发出一个completed 或者error;不会共享附加作用;可以通过 .create 创建
public enum CompletableEvent {
case error(Swift.Error)
case completed
}
三:Maybe - 发出一个元素或者发出一个completed 或者error;不会共享附加作用;通过 .create 创建
public enum CompletableEvent {
case success(Element)
case error(Swift.Error)
case completed
}
四:Driver - 不会产生error 事件;一定在MainScheduler监听(主线程);共享附加作用; 最后使用 drive 而不是 bindTo; 会对新观察者回放(重新发送)上一个元素; 状态序列选择Driver;
五:Signal - 与Driver相似,不会产生error 事件;一定在MainScheduler监听(主线程);共享附加作用; 最后使用 .emit(onNext: observer); 事件序列使用Signal
六:ControlEvent - 用于描述UI控件所产生的事件; 不会产生error ;在MainScheduler 订阅和监听; 共享附加作用;
Observer - 观察者**. [RxSwift** 已经创建一部分(view的隐藏,button的点击,label的文本,imageView的图片)]
一:anyObserver 可以用来描述任意的一个观察者
二: binder 不会处理错误事件;确保绑定在Scheduler上执行(默认在MainSchedule)
一旦产生错误事件,在调试环境下将执行 fatalError,在发布环境下将打印错误信息。
Observable & Observer 既是 可监听序列 又是 观察者
一: AsynSubject - 发出最后一个元素且需要.oncompleted() 来决定那个元素;在监听的过程,遇到error 事件会中止,接受error事件
二: PublishSubject - 订阅前发出的元素将不会发送给观察者,订阅后才接受事件
三: ReplaySubject - 将对观察者发送全部元素,无论观察者是何时进行订阅的。
如果把 ReplaySubject 当作观察者来使用,注意不要在多个线程调用 onNext, onError 或 onCompleted。这样会导致无序调用,将造成意想不到的结果。
四: BehaviorSubject - 它会将源 Observable 中最新的元素发送出来(如果不存在最新的元素,就发出默认元素)。然后将随后产生的元素发送出来; 如果源 Observable 因为产生了一个 error 事件而中止, BehaviorSubject 就不会发出任何元素,而是将这个 error 事件发送出来。
五: Variable - 相当于对BehaviorSubject 进行装箱;如果将Variable当成Observable,让订阅者进行订阅时,需要asObservable转成Observable;如果Variable打算发出事件,直接修改对象的value值即可;事件结束时,自动发出completed事件。(最新版本被遗弃了,Please use `BehaviorRelay` as a replacement.)。
::: BehaviorRelay 实际是封装了BehaviorSubject,使用函数accept发射值,获取当前的值:函数value。
Observable - 创建
-
asObservable 返回一个序列
-
create 使用 Swift 闭包的方式创建序列
-
deferred 只有在有观察者订阅时,才去创建序列(类似懒加载)
-
empty 创建一个空的序列,只发射一个 .Completed
-
error 创建一个发射 error 终止的序列
-
toObservable 使用 SequenceType 创建序列
-
interval 创建一个每隔一段时间就发射的递增序列
-
never 不创建序列,也不发送通知
-
just 只创建包含一个元素的序列。换言之,只发送一个值和 .Completed
-
of 通过一组元素创建一个序列
-
range 创建一个有范围的递增序列
-
repeatElement 创建一个发射重复值的序列
-
timer 创建一个带延迟的序列
Operator - 操作符**(变换序列)**
map: 用你指定的方法去变换每一个值
flatMap: 将一个序列发射的值转换成序列,然后将他们压平到一个序列
flatMapFirst
flatMapLatest
所以我们在需要总是保持接受最新的数据时(比如网络请求),选择 flatMapLatest 。
scan: 应用一个 accumulator (累加) 的方法遍历一个序列,然后返回累加的结果。此外我们还需要一个初始的累加值
let intOb = Observable.of(0, 1, 2, 3, 4)intOb.scan(0) { (e, s) in return e + s }
.subscribe { print($0) }Result: next(0),next(1),next(3),next(6),next(10),completed
reduce: 和 scan 非常相似,唯一的不同是, reduce 会在序列结束时才发射最终的累加值
let intOb = Observable.of(0, 1, 2, 3, 4)
intOb.reduce(0) { (e, s) in return e+s } mapResult: { (r) in "\(r)" + "result" }
.subscribe { print($0) }
Result: next(10result) completed
buffer: 在特定的线程,定期定量收集序列发射的值,然后发射这些的值的集合。
let intOb = Observable.of(0, 1, 2, 3, 4, 5)intOb.buffer(timeSpan: .seconds(5), count: 2, scheduler: MainScheduler.instance).subscribe { print($0) }Result:Next([0, 1]),Next([2, 3]),Next([4, 5]),Next([]) Completed
window: window 和 buffer 非常类似。唯一的不同就是 window 发射的是序列, buffer 发射一系列值。
Operator - 操作符**(过滤序列)**
filter: 应该是最常用的一种过滤操作了。传入一个返回 bool 的闭包决定是否去掉这个值。
distinctUntilChanged(): 阻止发射与上一个重复的值。
take: 只发射指定数量的值。
take(while:) 遍历每个值,不满足条件则发送completed
take(until:) 遍历每个值,直到满足条件则发送completed
take(for:) ??
takeLast: 只发射序列结尾指定数量的值。
single: 类似于 take(1) 操作,不同的是 single 可以抛出两种异常: RxError.MoreThanOneElement 和 RxError.NoElements 。当序列发射多于一个值时,就会抛出 RxError.MoreThanOneElement ;当序列没有值发射就结束时,single 会抛出 RxError.NoElements 。
skip:忽略指定数量的值。
debounce 和 throttle : 仅在过了一段指定的时间还没发射数据时才发射一个数据,换句话说就是 debounce 会抑制发射过快的值。注意这一操作需要指定一个线程。
eg:比如点击一个 Button 会请求一下数据,然而总有刁民想去不停的点击,那这个 debounce 就很有用了。
elementAt: 发射序列指定位置的值
sample: 就是抽样操作,按照 sample 中传入的序列发射情况进行抽样。
Operator - 操作符**(组合序列)**
startWith: 在一个序列前插入一个值。
concat: 在一个序列后插入一个序列
combineLatest:当两个序列中的任何一个发射了数据时,combineLatest 会结合并整理每个序列发射的最近数据项。
zip: zip 和 combineLatest 相似,不同的是每当所有序列都发射一个值时, zip 才会发送一个值。它会等待每一个序列发射值,发射次数由最短序列决定。结合的值都是一一对应的。
merge: 会将多个序列合并成一个序列,序列发射的值按先后顺序合并。要注意的是 merge 操作的是序列,也就是说序列发射序列才可以使用 merge
switchLatest: 和 merge 有一点相似,都是用来合并序列的。然而这个合并并非真的是合并序列。事实是每当发射一个新的序列时,丢弃上一个发射的序列
Operator - 操作符**(错误处理)**
retry - 重试 eg:.retry(4) // 重复4次
retryWhen - 重试时,可以控制的操作流程。
eg: 延迟5秒在重试
.retryWhen { (rxError: Observable<Error>) -> Observable<Int> in
return Observable<Int>.timer(5.0, scheduler: MainScheduler.instance)
}
catch - 当出现 Error 时,用一个新的序列替换。
catchAndReturn - 当出现 Error 时,用一个新的值替换。
Result - …
Disposable - 可被清除的资源;通常说,当一个序列发出error事件,completed事件,那么所有的内部资源都会被释放掉。如果想要提前释放或取消订阅的话,那么你可以对返回的 可被清除的资源(Disposable) 调用 dispose 方法。
一:DisposeBag - 清除包; 当 清除包 被释放的时候,清除包 内部所有 可被清除的资源(Disposable) 都将被清除;生命周期和vc一样。
二:takeUntil - .takeUntil(vc.rx.deallocated)
三:dispose()
Schedulers - 调度器 是 Rx 实现多线程的核心模块,它主要用于控制任务在哪个线程或队列运行。
一: subscribeOn - 决定数据序列的构建函数在哪个Schedule执行。
二: observeOn - 决定在哪个Schedule监听这个数据序列
MainSchedule - 主线程
SerialDispatchQueueScheduler - 抽象了串行。
ConcurrentDispatchQueueScheduler - 抽象了并行
OperationQueueScheduler - 抽象了NSOperationQueue。它具备 NSOperationQueue 的一些特点