为了引出MVVM + RAC在项目中实现,所以这里来先对RactiveCocoa作个概括介绍。
RactiveCocoa是函数式响应式编程思想启发下写出来的一套框架,整合了系统的各种UI响应事件、通知、代理、KVO等功能,提供了使用更方便更内聚的API,思路是通过信号的创建和订阅来完成消息传递的。下面是关于RactiveCocoa的一些简短的介绍,希望OC项目中还没有用RactiveCocoa的,赶紧用起来!
一、主要类的介绍
既然你自己去看源码或者是在项目中使用的时候,也是要了解这些类的,我就这里介绍下,帮您节省些时间。(这部分请跳读再细读)
-
RACStream
是一个抽象类,定义了流的一些操作方法。框架里面主要是使用的RACStream 的子类RACSignal和RACSequence来完成操作的 -
RACSignal
,信号类,框架的核心类,可以订阅这个信号来收到回调,每次订阅都会收到一次block的回调. 可以自定义创建,也可以使用框架里面提供的子类 -
RACSubscriber
,订阅者类,遵守了RACSubscriber
协议的对象都可以是订阅者,可以调用方法sendNext:
、sendError:
、sendComplete:
, 调用后即回调对应的block。 -
RACDisposable
, 订阅关系的取消和相关资源的清理, 注意不是清理信号对象。
RACSignal类的结构:

RACSubscriber类的结构:

RACDisposable类的结构:

二、工作原理
信号创建和订阅的方法介绍
// RACSignal.h文件里面提供的创建方法
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe;
// 信号订阅的方法
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock error:(void (^)(NSError *error))errorBlock completed:(void (^)(void))completedBlock;
MVVM 模式下的使用例子
// 信号的创建(viewModel定义了loginSignal 信号)
self.loginSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 省略了发送请求的代码....
[subscriber sendNext:@(1)];
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{ }];
}];
// 信号的订阅(这里是在控制器中订阅viewModel的信)
[self.viewModel.loginSignal subscribeNext:^(NSNumber *nomoreDataStatu) {
// do some thing
}];
通过框架源码里面的方法调用追踪
总结起来就是:
- 信号(RACSignal)创建时RACSignal对象保存好传入的
didSubscribe
这个block. - 在信号被订阅时(即信号的subscribeNext:方法调用),会创建RACPassthroughSubscriber订阅者对象来保存订阅时传入的
sendNext
、sendError
、sendComplete
这个三个block,再调用didSubscribe
. - 在
didSubscribe
里面使用参数subscriber
调用sendNext、sendError、sendCompleted这三个方法,就会分别调用订阅时传入的block(sendNext
、sendError
、sendComplete
这个三个block) - 在
[subscriber sendCompleted];
这句代码调用后,代表这一次的订阅就结束了,不会再收到回调了;要收到回调需要再次订阅这个信号。
可以跟着这个博客去详细了解:ReactiveCocoa 中 RACSignal 是如何发送信号的
三、RactiveCocoa的优点
- 给OC增加了元组(RACTuple)这个新的数据类型,这个在swift里面才有的数据类型
- 运用信号订阅这个概念,扩展出了多个信号关联、信号变换、信号压缩后再传递等实用的功能。
- 除MVVM + RAC的实际使用外,对于系统提供的API的整合也使得编程方便了许多。ReactiveCocoa框架里面应该要了解的几个功能
四、MVVM + RAC在项目中实现
设计模式MVVM、MVC在iOS中实现对比
demo地址:https://github.com/1ikeSmi1e/MVVM_use
下载下来后需要使用命令行之后再打开
cd xxxx下载的目录 // + 回车
pod install
参考文章
ReactiveCocoa自述:工作原理和应用
iOS 最全ReactiveCocoa原理及使用方法
最快让你上手ReactiveCocoa之进阶篇
ReactiveCocoa 中 RACSignal 是如何发送信号的
ReactiveCocoa学习笔记六-RACDisposable源码分析
网友评论