RxSwift Notes
为什么要使用RxSwift?
我们所写的大量代码往往都围绕着外部的操作。当用户点击,我们需要通过IBAction来对其进行响应;当用户键盘位置发生变化,我们通过Notification来收取通知;当网络请求返回数据时,我们需要提供block来对该数据进行处理;属性发生变化时,我们使用KVO进行观察。所有的这一切都无意义地增加了代码的复杂程度。
是否会有一种具有一致性的系统,使我们的代码处理方式变得更好?RxSwift就是这样的一种系统。
RxSwift & RAC
具体可以看这篇回答,写的比较全面。大致总结一下:
RAC(ReactiveCocoa)是一个有好几年历史的老项目了,Github团队出品,诞生在OC时代,现在也已经推出了最新的Swift版本,有稳定的社区,也已经有了很多成熟的项目,如果你是一个非常习惯Cocoa的工程师,那RAC应该会是你所喜欢的。
而RxSwift是Swift时代的新产物,虽然年轻,但是却是属于ReactiveX组织,也是根正苗红,语法上几乎沿袭了Rx.Net、RxJava、RxJS,如果熟悉了这套语法,基本可以在任何平台上顺利上手。
总之,它们就是同一种理念(FRP)的两种实现。
Rx.playground
Rx.playground是学习RxSwift的主要学习素材,在官方项目中。本文选取并翻译了其中的内容。
tips:直接打开RxSwift项目,会发现rx.playground报错:import RxSwift。处理方法很简单,你只需编译一下库:
- 选择 RxSwift-OSX Scheme
- 编译 (Command+B)
从基础开始吧!
Observables 观察者
理解RxSwift的关键就是理解Observable的概念。创建Observable、操作Observable、订阅Observable,从而响应它们的变化。下面列举了几种创建的方法,具体代码自己可以去项目看,这里只罗列出名称术语和解释。
empty 创建一个空序列,只会发出Completed信号;never 创建的序列不会发出任何信号,包括completed;just 包含一个事件一个complete;sequenceOf 可以将一组数字元素换为序列;from 将SequenceType转化为序列;creat 通过Swift闭包创建一个序列。.on 创建事件;failWith 创建一个仅包含错误的Observable;deferred 当有订阅者时才创建Observable,为每个每个观察者创建一个全新的Observable
RxCocoa库还有很多实用的方法:rx_observer用来封装KVO,rx_tap封装了按钮@IBAction,rx_notification封装了NotificationCenter事件,还有许许多多。这种感觉和RAC中的各种扩展很类似。
Subject
Subject既可以是Observable也可以是Observable的订阅者,它就像是一个桥梁作为中转,可以订阅其它的Observable,同时自身也可以被订阅。
PublishSubject 向订阅者发送订阅后的序列。
ReplaySubject 和PublishSubject不同的是会根据设置的缓存大小补发之前的序列,然后再发送订阅后的序列。
BehaviorSubject 会首先向订阅者发送最近一次的事件,然后再发送订阅后的序列。
Variable 封装了BehaviorSubject。它的优点在于不会像后者那样对外发送Complete或者是Error。当Variable被释放后也会自动complete,无需手动进行处理。
三种转换方式:map,flattenMap,scan。map和swift函数式中的map类似,是对每个输入事件进行转换;flattenMap则是对多个序列进行转换,最后降维到一个输出序列中;最后的scan会将之前输出的数值作为下一个输入,从而进行连续的处理。
三种过滤处理:filter,distinctUntilChanged,take。filter会要求Observable只发送符合要求的事件;distinctUntilChanged功能很简单,它会过滤掉相邻内容相同的事件;take(n)要求Observable只发送前n个事件。
几种合并方法
startWith 由某个特定的事件前缀的序列。combineLatest 合并多个序列最新的事件旦某个序列发出新事件后,就会产生输出。zip 和combineLatest类似,区别在于只有当所有序列都发出新事件时,才会进行合并产生新的合并事件。
merge 对多个序列按照顺序合并;switchLatest 将多个序列合并时,选择最新序列的事件输出。
错误处理包括catchError,捕获Error事件。retry是用来在发生错误后重试。
Observable订阅方式有Subscribe普通订阅、SubscribeNext只包含next事件、SubscribeComplete只包含complete事件、SubscribeError只包含错误事件。
两种条件操作:takeUntil与takeWhile。如字面含义一样,前者是在第二个序列开始发送事件时,停止第一个序列的时间发送;而后者是在满足某些条件的时候发送事件,当某个事件不符合条件时,则停止发送。
还有一些数学处理方法。比如concat() 将两个序列进行合并,但不破坏顺序;reduce 对序列中的元素进行数据操作,产生新的结果。