RxSwift 笔记

492 阅读7分钟

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 的一些特点