RAC简介
- 在RAC中,万物皆信号。
- RAC 指的就是 RactiveCocoa ,是 Github 的一个开源框架,能够通过信号提供大量方便的事件处理方案,让我们更简单粗暴地去处理事件,现在分为 ReactiveObjC(OC) 和 ReactiveSwift(swift),官方的说,ReactiveCocoa(其简称为RAC)是由GitHub开源的一个应用于iOS和OS X开发的新框架。RAC具有函数式编程和响应式编程的特性。。
- 团队协作时,必须注意一个点,对于很熟悉RAC的人来说,使用RAC是非常方便的。但对于不熟悉RAC的人来说,由于RAC的可阅读性是很差的,所以需耗费大量时间阅读和学习。
- 未避免循环引用,需使用@weakify(self),@strongify(self)。这两个宏至少是一对出现的
- RAC就是一个第三方库,他可以大大简化你的代码过程。
RAC架构框架图
一 、使用
老规矩,pod install
pod 'ReactiveObjC', '~> 3.0.0' //建议纯oc代码使用ReactiveObjC
1、基本控件
- UITextField
//监听文本输入
[[_textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@",x);
}];
//可根据自己想要监听的事件选择
[[_textField rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@",x);
}];
//添加条件 -- 下面表示输入文字长度 > 10 时才会调用subscribeNext
[[_textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
return value.length > 10;
}] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"输入框内容:%@", x);
}];
- UIButton
//监听按钮点击事件
[[View.btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"-->%@",x);
}];
//这种不建议使用,暂时不知道didBtnAction方法不写会报警高~不过可以也实现
// [[View.btn rac_signalForSelector:@selector(didBtnAction:)]subscribeNext:^(id x) {
// NSLog(@"-->%@",x);
// } completed:^{
// }];
rac 类似代理传值例子
//第一
@property (strong,nonatomic) RACSubject *btnSubject;
//第二,在View点m,按钮点击方法里面
// view里面带有btn,点击的时候
- (void)didBtnAction:(UIButton *)btn{
SWLog(@"回到控制器后g要干嘛?");
[self.btnSubject sendNext:@{@"text":@"这边可以携带参数"}];
}
- (RACSubject *)btnSubject{
if (!_btnSubject) {
_btnSubject = [RACSubject subject];
}
return _btnSubject;
}
//控制器外部调用
[View.btnSubject subscribeNext:^(id x) {
SWLog(@"收到!==%@",x);
// log==> @{@"text":@"这边可以携带参数"}
} completed:^{
}];
- 计时器(interval、delay)
/*
声明:RACDisposable *disposable
创建一个RACDisposable,调用disposable方法等时候就会进入创建对象的block,把定时器释放掉
这两个宏就是为了解决循环引用的,且必须配套使用。
@weakify(self)
@strongify(self)
相当于下面:
__weak typeof(self) weakSelf = self;
__strong typeof(weakSelf) strongSelf = weakSelf;
*/
//类似timer
@weakify(self)
self.disposable = [[RACSignal interval:2 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDate * _Nullable x) {
@strongify(self)
NSLog(@"时间:%@", x); // x 是当前的时间
//关闭计时器
[self.disposable dispose];
}];
//延时
[[[RACSignal createSignal:^RACDisposable *(id subscriber) {
[subscriber sendNext:@"延时2秒"];
return nil;
}] delay:2] subscribeNext:^(id x) {
NSLog(@"-->%@",x);
}];
2.KVO 属性监听
//方法一
[_redView rac_observeKeyPath:@"frame" options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
NSLog(@"方法一 %@",value);
}];
//方法二
[[_redView rac_valuesForKeyPath:@"frame" observer:nil] subscribeNext:^(id _Nullable x) {
NSLog(@"方法二 %@",x);
}];
//方法三 宏写法
[RACObserve(_redView, frame) subscribeNext:^(id _Nullable x) {
NSLog(@"方法三%@",x);
}];
3.textField监听,lable赋值,手势
//此处RAC宏相当于让_label订阅了_textField的文本变化信号
//赋值给label的text属性
RAC(_label, text) = _textField.rac_textSignal;
//快速添加手势
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]init];
[[tap rac_gestureSignal] subscribeNext:^(id x) {
} completed:^{
}];
[newTextLable addGestureRecognizer:tap];
//输入框监听
[[self.textFild rac_textSignal] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
4.监听 Notification 通知事件
//通知常用
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"通知名字" object:nil]subscribeNext:^(id x) {
} completed:^{
}];
5.多个订阅 RACMulticastConnection
- (void)sss{
RACSignal *signal=[RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) {
[subscriber sendNext:@"123444"];
return nil;
}];
RACMulticastConnection *mut = [signal publish];
[mut.signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[mut.signal subscribeNext:^(id _Nullable x) {
NSLog(@"22%@",x);
}];
[mut connect];
}
6.绑定信号 bind
- (void)text{
RACSubject *signal = [RACSubject subject];
[[signal bind:^RACStreamBindBlock _Nonnull{
return ^RACSignal *(id value, BOOL* stop){
NSLog(@"%@",value);
NSString *v = [NSString stringWithFormat:@"处理过的数据%@",value];
return [RACReturnSignal return:v];//需要导入头文件#import "RACReturnSignal.h"
};
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[signal sendNext:@"1111"];
//输出
//1111
//处理过的数据1111
}
7.映射
- (void)text{
//映射
RACSubject *subject = [RACSubject subject];
[[subject map:^id _Nullable(id _Nullable value) {
return [NSString stringWithFormat:@"处理过的数据%@",value];
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
} ];
[subject sendNext:@"11"];
//输出
//处理过的数据11
}
8.忽略 ignore
- (void)text2{
RACSubject * subject = [RACSubject subject];
[[subject ignore:@"a"] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[subject sendNext:@"a"];
[subject sendNext:@"b"];
[subject sendNext:@"c"];
//输出log
// 2019-03-07 14:35:00.348048+0800 MVVM+RAC[10199:763418] b
// 2019-03-07 14:35:00.348200+0800 MVVM+RAC[10199:763418] c
}