ReactiveCocoa 是一个非常复杂的框架,刚刚学习不久,对宏和signal研究还不够深入,在此仅对框架做一个简单的梳理,并介绍一些常见signal的用法,算是对这段时间的一个总结。对于ReactiveCocoa与MVVM的联系以及RAC的宏与冷热信号的分析,详见后续~
简介
ReactiveCocoa是一个iOS中的函数式响应式编程框架,它受Functional Reactive Programming的启发,是Justin Spahr-Summers和Josh Abernathy在开发GitHub for Mac过程中的一个副产品,它提供了一系列用来组合和转换值流的API。
从上面的类图可以看出,ReactiveCocoa主要由以下四大核心组件构成:
信号源:RACStream及其子类; 订阅者:RACSubscriber的实现类及其子类; 调度器:RACScheduler及其子类 清洁工:RACDisposable及其子类。
信号源是最核心的部分,其他组件都是围绕它运作的。
对于一个应用来说,绝大部分的时间都是在等待某些事件的发生或响应某些状态的变化,比如用户的触摸事件、应用进入后台、网络请求成功刷新界面等等,而维护这些状态的变化,常常会使代码变得非常复杂,难以扩展。而ReactiveCocoa给出了一种非常好的解决方案,它使用信号来代表这些异步事件,提供了一种统一的方式来处理所有异步的行为,包括代理方法、block回调、target-action机制、通知、KVO等
信号源
在ReactiveCocoa中,信号源代表的是随着时间而改变的值流,这是对ReactiveCocoa最精准的概括,订阅者可以通过订阅信号源来获取这些值:
RACStream是一个抽象类,通常情况下,我们并不会去实例化它,而是直接使用它的两个子类RACSignal和RACSequence。RACStream就是以Monad的概念为依据进行设计的,它代表的就是一个Monad。(关于Monad具体可以参考这篇文章Functor、Applicative 和 Monad) 那么什么是信号呢? 信号是一个发送一连串值的物体。 如果有订阅者监听时(即已订阅)信号才会发信息。它将会向那个订阅者发送0或多个载有数值的“next”事件,后面跟着一个“complete”事件或一个“error”事件。 信号类似于其他语言/工具包中的 “promise”, 但更强大, 因为它不仅限于向它的订阅者一次只传递一个返回值。可以过滤, 转换, 分解和合并那些值. 不同的订阅者可能需要使用信号通过不同方式发送的值。 信号又分为冷信号和热信号,这篇文章细说ReactiveCocoa的冷信号与热信号讲的非常棒,有兴趣的可以细读。