Chesterlee's Zen

Follow your heart and intuition

使用ReactiveCocoa

本篇的文章的目的很明确,就是要会使用RAC。这里对RAC的关键概念和行为做出较为清晰的说明,便于使用。

ReactiveCocoa衍生自FRP(响应链编程)的一种,它是用OC语言来描述FRP的一个框架。其根源可以追述到如下论坛:Haskell

要会使用RAC,首先要了解FRP,了解了响应链编程之后,才可以顺利的使用RAC。PS:其实回过头来思考,RAC使用的语言和方法并不重要,重要的是这些概念。如果后续要转入Swift的FRP,也是一样。

核心概念:

  • 信号(Signal):信号是RAC的核心。我的理解是,在RAC的编码中,对于数据的反射式响应传输,都是以信号为基础来实现的。没有它,就没有响应式自动化。

  • 订阅者 (Subscriber):订阅者是使信号有效的一个重要角色。在FRP中,一个信号创建之后,是没有意义的,此时它不知道给谁传送数据,此时它是Cold的。而只有当他被一个或多个Subscriber订阅之后,信号接到事件源之后,就会触发响应,并发送数据给订阅者。

通常的使用做法是:
a、使用一个既有信号(RAC已经给你wrapper好的Category),然后使用匿名subscriber去做订阅行为,获取到next送来的值,或者error、completed的block,来做相应的业务逻辑操作。
b、如果自己要自定义信号,则需要通过create信号的方式,建立一个信号,在这个信号中执行数据获取、异步计算等操作,并在信号中发送sendNext、sendCompleted或sendError等数据或行为。注意,在sendNext中发送的数据,就是subscriber接到的数据。

另外,对于FRP而言,最为重要的就是信号和信号之间的关系:filter、flattenMap、CombineLatest、takeUntil、then等处理。下面简要说明下:

  • filter:信号过滤,用于判断信号返回值的业务合法性。只有合法的信号,才可以被继续向下输送。
  • flattenMap(Map):信号映射,可以将信号的发送过来的值重新计算,并以一个新值发送出去。
  • CombineLatest:是将多个信号合并为一个信号,但是这个信号承载的value是多个信号返回的value。
  • takeUntil:一个信号是一直hot的,但是当另外一个信号有效时,它就会失效。
  • then:当某个信号结束后,可以用then来继续后续的wapper,返回或新生成一个新的signal,来继续操作。

ReactiveCocoa还支持对系统Event、Notification、liftSelector、多线程、timer等处理。

我们可以看到,RAC可以在不影响原有业务逻辑的情况下,新增新的更复杂的业务逻辑。象积木一样不断积累和可扩展。而完全不必要地新增状态变量,让原有的代码发生更改。

本文只讲解比较关键的几个概念,详细的概念可以参看下面的文章,代码可以看看文中具体的使用也可以见UseRAC中的代码。

文中的概念参考文章有:
1、函数式反应型编程(FRP) —— 实时互动应用开发的新思路
2、ReactiveCocoa in github
3、Getting Started with ReactiveCocoa
4、MVVM Tutorial with ReactiveCocoa: Part ½
5、MVVM Tutorial with ReactiveCocoa: Part 2/2
6、ReactiveCocoa2实战

Comments