1、概述
ReactiveCocao(以下简称RAC)和ReactExtentsion(以下简称RXSwift)都是响应式编程,但是RAC是一个框架,RXSwift是一个在swift本身的语言特性上的响应式的一个扩展。ReactiveCocao是一个框架总称,在ReactiveCocao下面有四大家族:
- ReactiveCocao:一般大家说的就是这个它包含OC和Swift的代码。
- ReactiveObjc:它包含OC代码部分,如果你的项目是纯OC项目建议使用这个。
- ReactiveSwift:它包含Swift的代码,如果你的项目是纯Swift项目可以使用这个,不过纯Swift项目建议使用RXSwift。
- ReactiveBriged:如果你的项目是OC和Swift混编建议使用这个。
2、什么是响应式编程?
官方概念:响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。特码其实我都看不明白,举个实际的列子:在我们编程中经常遇到这样的情况,模型person的name = 张三,age = 20,在view中显示name:张三、age:20等信息,我们将模型数据数据改变,我们需要重新调用view中的代码来更改UI。使用响应式编程后不需要在中心调用设置UI代码。如图:画的不好欢迎吐槽~~~
正常情况下:
使用响应式编程
3、RAC能做什么?
他能接管苹果所有的监听事件,例如我们常使用的addTarget、代理、通知以及KVO。
4、RAC安装
使用cocopods安装即可
pod search "ReactiveObjC"
搜索成功后粘贴 pod 'ReactiveObjC', ~> 3.0.0
需要别的pod对应的库
安装完后引入头文件#import “ReactiveObjC.h",编译通过,敲出RAC能够看到对应RAC的东西,那就没问题喽。
下面附上一张图希望大家喜欢
5、RAC的原理
6、RAC的使用
- 基本使用
//RAC初级用法
- (void)dome1 {
//1、创建信号
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//3、发送信号
[subscriber sendNext:@"我是ARC"];
return nil;
}];
//2、订阅信号
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
}
高级点用法
- (void)demo2 {
//1、创建信号
[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//3、发送信号
[subscriber sendNext:@"我是ARC"];
return nil;
}] subscribeNext:^(id _Nullable x) {////2、订阅信号
NSLog(@"%@",x);
}];
}
常用的一些,例如监听UIButton
-(void)demo3{
[[self.btn rac_signalForControlEvents:(UIControlEventTouchUpInside)]subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@",x);
}];
}
监听UITextField
-(void)demo2 {
@weakify(self);
[[self.testTextFileld rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@",x);
@strongify(self);
self.testTextFileld.text = @"Hello";
}];
}
监听程序进入后台
-(void)demo4{
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"%@",x);
}];
}
使用RAC需要注意的问题
注意循环引用,在block中使用self,一定注意循环引用。
ARC提供了两个宏:
@weakify(self)打断循环引用
@strongify(self) 防止提前对象被释放
这两个宏一定要成对使用不要只使用@weakify(self)或者@strongify(self) 。