前言
上次接触ReactiveCocoa已经是三年前的事情了,最近公司开新项目了,我选择了MVVM+ReactiveCocoa架构,但是开始撸代码时发现RAC的接口好像变化很大,就再此学习一下。
框架引入
框架介绍
为了适应Objective-C、swift,ReactiveCocoa将代码拆分为四个库:ReactiveCocoa(集中于UI)、ReactiveSwift(swift版)、ReactiveObjC(OC版)、ReactiveObjCBridge(桥接)。
笔者新项目是以OC语言开发的,主要是讲解ReactiveObjC的使用
框架集成
笔者采用cocoapods来管理的,这里吐槽一下,ReactiveObjC的介绍页面居然都没有相应的集成语句。
pod 'ReactiveObjC'
主要的类
ReactiveCocoa主要由下面四个核心组件组成:
- 信号源:RACStream以及其子类
- 订阅者:实现RACSubscriber协议的类
- 调度器:RACScheduler以及其子类
- 清洁工:RACDisposable以及其子类
信号源
RACStream
RACStream是一个抽象的类,任何对象的序列都可以理解为stream,在开发中我们一般是应用他的子类RACSignal、RACDisposable来进行开发。
RACSignal
RACSignal是我们开发中用的最多的一个类,RACSignal通常表示将要交付的数据,必须要有订阅者订阅后才可以发送数据。
RACSignal可以向订阅者发送以下三种不同的事件:
- next 事件:该事件从流中提供一个新值,以传递给下一个订阅者。
- error 事件:该事件表示在信号结束前出现了错误,该事件可以携带一个NSError对象传递。
- completed事件:该事件表示信号已经完成,清洁工将开始销毁相应对象。
在日常开发中,一般是由一个或者多个next 事件,以及一个error 事件或者completed事件组成。
RACSignal提供了以下操作符(可理解为方法)方便我们处理信号:(该示例代码来自:ReactiveCocoa文档)
- +merge merge操作符:将多个信号集中到一个信号中,任意一个信号中有数据到达就触发一下。
RACSubject *letters = [RACSubject subject];
RACSubject *numbers = [RACSubject subject];
RACSignal *merged = [RACSignal merge:@[ letters, numbers ]];
// Outputs: A 1 B C 2
[merged subscribeNe