在RAC中,万物皆信号。
RAC 指的就是 RactiveCocoa。
是Github 的一个开源框架,能够通过信号提供大量方便的事件处理方案,让我们更简单粗暴地去处理事件.
现在分为 ReactiveObjC(OC) 和 ReactiveSwift(swift)。
前言
1.团队协作时,必须注意一个点,对于很熟悉RAC的人来说,使用RAC是非常方便的。但对于不熟悉RAC的人来说,由于RAC的可阅读性是很差的,所以需耗费大量时间阅读和学习。
2.为避免循环引用,需使用@weakify(self),@strongify(self)。这两个宏至少是一对出现的
3.RAC架构框架图

4.信号流程

5.RAC项目实际应用


一、基本使用
1、基本控件
- UITextField
1 | //监听文本输入 |
- UIButton
1 | //监听按钮点击事件 |
- 计时器(interval、delay)
1 | //类似timer |
2、监听属性变化
1 | //监听self的name属性 |
3、遍历数组和字典
1 | //遍历数组 |
4、监听 Notification 通知事件
1 | [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"notification" object:nil] subscribeNext:^(NSNotification * _Nullable x) { |
5、代替Delegate代理
1 | //监听按钮点击方法的信号 |
二、RAC常用类
- RACSignal
1 | RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { |
- RACSubject(可发送信号也可以订阅信号)
1 | //创建RACSubject |
- RACTuple(元组)– 其内部就是封装了数组,用起来跟数组差不多
1 | //通过定值创建RACTuple |
- RACMulticastConnection 一个信号,被多次订阅时,避免多次调用创建信号中的block
1 | RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { |
- RACCommand 监听信号的状态

1 | NSString *input = @"执行"; |
三、高级函数使用
1、连接信号、合并信号等
1.1、 concat – 当多个信号发出的时候,有顺序的接收信号
信号signal3去监听signal1和signal2,必须是接收signal1完后才会接收signal2
1 | RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { |
1.2、combineLatestWith – 将多个信号合并起来,并且拿到各个信号的最新的值,必须每个合并的signal至少都有过一次sendNext,才会触发合并的信号(订阅者每次接收的参数都是所有信号的最新值),不论触发哪个信号都会触发合并的信号
信号signal3去监听signal1和signal2,每次回调两个信号的最新值
1 | RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { |
1.3、 then – 用于连接两个信号,等待第一个信号完成,才会连接then返回的信号
1 | RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { |
1.4、 merge – 把多个信号合并为一个信号来监听,任何一个信号有新值的时候就会调用
一个信号signal3去监听signal1和signal2,每次回调一个信号
1 | RACSignal *signal3 = [signal1 merge:signal2]; |
1.5、 zipWith – 把两个信号压缩成一个信号,只有当两个信号都发出信号内容时,才会触发
一个信号signal3去监听signal1和signal2,但必须两个信号都有发出
1 | RACSignal *signal3 = [signal1 zipWith:signal2]; |
1.6、 reduce 聚合 – 把多个信号的值按照自定义的组合返回
1 | RACSignal *signal3 = [RACSignal combineLatest:@[signal1,signal2] reduce:^id(NSString *s1 ,NSString *s2){ |
2、flattenMap & map 映射
1 | //map事例 |
3、filter – 过滤、ignore – 忽略、distinctUntilChanged – 忽略相同
- filter、ignore
1 | //添加条件 -- 下面表示输入文字长度 > 10 时才会调用subscribeNext |
- distinctUntilChanged
1 | RACSubject *subject = [RACSubject subject]; |
- 本文作者: Grx
- 本文链接: https://ruixiaoguo.github.io/Grx.github.io/Grx.github.io/2020/08/08/IOS RAC基本使用/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!