文章前言
一般在使用一个框架之前需要了解的事情,也就是需要了解的东西,本人总结了一下有下面几点(比较浅显,欢迎喷口水):
1. 这个框架有什么用,即这个框架能够给我带来什么作用
2. 怎么集成这个框架
3. 框架的使用方法
下面就从这几个点展开
一、这个框架有什么用,即这个框架能够给我带来什么作用
- 在我们iOS开发过程中,当某些事件响应的时候,需要处理某些业务逻辑,这些事件都用不同的方式来处理。
- 比如按钮的点击使用action,使用delegate,属性值改变使用KVO,通知等系统提供的方式。都可以通过RAC处理
- ReactiveCocoa为事件提供了很多处理方法,而且利用RAC处理事件很方便,可以把要处理的事情,和监听的事情的代码放在一起,这样非常方便我们管理,就不需要跳到对应的方法里。非常符合我们开发中高内聚,低耦合的思想。
二、 怎么集成这个框架(这里只介绍cocoaPods的集成方法)
- OC版的ReactiveCocoa(下面简称RAC)集成方法
pod 'ReactiveObjC'或者pod 'ReactiveObjC', '~> 指定版本'
- swift版的ReactiveCocoa集成方法
pod 'ReactiveCocoa'或者pod 'ReactiveCocoa', '~> 指定版本'
相信集成这个框架对于一个iOS开发者来说并不是什么难事,下面就介绍框架的几种常用方法废话不多说直接上代码
三、框架的使用方法
1. RACSignal框架中最常用的一个类
- RACSiganl:信号类,表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据
- 默认一个信号都是冷信号,也就是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。
- 如何订阅信号:调用信号RACSignal的subscribeNext就能订阅。
2. RACSignal使用步骤
- 创建信号
+ (RACSignal *)createSignal:(RACDisposable * (^)(id subscriber))didSubscribe
当然还有其他的创建方法,可以自行尝试
- 订阅信号,才会激活信号
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
- 发送信号
- (void)sendNext:(id)value
这里发送信号的入参value,可以是网络请求的返回值,以及各种你想要传递出去的东西
上代码
//1.创建信号
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {
//保存起来 就不会被取消订阅
_subscriber = subscriber;
//3.发送信号
[subscriber sendNext:@1];
return [RACDisposable disposableWithBlock:^{
NSLog(@"默认信号发送完毕被取消");
}];
}];
//如果要取消就拿到 RACDisposable
//2.订阅信号
RACDisposable *disposable = [signal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//取消订阅
[disposable dispose];
}
看过上面的方法,再来看一波网络请求的使用方法
[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 这里进行一个网络请求
DELAY(1000000000000);
// 如果请求成功就发送next和complete事件,如果失败就发送error事件
[subscriber sendNext:@"第一个任务"];
// 这里记住一定要调用sendCompleted方法,因为不调用完成这个方法,信号就不会销毁,一直占用着内存,这个是开发者们最不希望看到的
[subscriber sendCompleted];
// [subscriber sendError:nil];
return [RACDisposable disposableWithBlock:^{
NSLog(@"默认信号发送完毕后就会被销毁,没有订阅者的时候就会被销毁");
}];
}];
到这里,我觉得RACSignal信号类的使用方法应该能够掌握了,这里讲解一下代码里用到的一些类和协议
- RACSubscriber:表示订阅者的意思,用于发送信号,这是一个协议,不是一个类,只要遵守这个协议,并且实现方法才能成为订阅者。通过create创建的信号,都有一个订阅者,帮助他发送数据。
- RACDisposable:用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。
使用场景:不想监听某个信号时,可以通过它主动取消订阅信号。
3. 回看到文章的开头,RAC的作用第二点
比如按钮的点击使用action,使用delegate,属性值改变使用KVO,通知等系统提供的方式。都可以通过RAC处理
下面就介绍一些常用的用法不仅可以节约开发时间,而且可以使逻辑代码更加的集中,举个例子:给按钮添加一个target,首先需要addtarget,然后需要写一个方法实现,其实系统的也不麻烦,但是RAC给我们提供了更加快捷的方案,请看表演:
/**
按钮的点击事件
*/
- (void)addButtonTarget {
UIButton *loginButton = [[UIButton alloc] init];
loginButton.backgroundColor = [UIColor grayColor];
loginButton.frame = CGRectMake(150, 220, 100, 100);
[self.view addSubview:loginButton];
[[loginButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@", x);
}];
}
想必看到这里大家应该能够看到快捷的地方了,不用添加target,不用再定义一个方法!这个解释一下代码
- rac_signalForControlEvents这个方法的返回值其实是一个信号类,即RACSignal类,再会看到上面提到的RACSignal的使用方法,先创建信号,其实这里内部就会创建一个信号并且返回
- subscribeNext这里就是订阅信号了
- 最后发送信号,你可以在subscribeNext的block里面看到,里面的参数,其实就是点击按钮传递出来的值,可以理解为信号携带的值
这里再举一个例子:监听文本输入框事件。相信大家在开发中经常会遇到需要监听文本框,以此来对付产品提出的各种逆天并且领先科技N年的想法,通常做法都是addtarget,或者delegate,实现各种代理方法,这里使用RAC可以达到异曲同工的效果,上代码:
/**
监听文本框的输入
*/
- (void)textFieldChange {
UITextField *textFidle = [[UITextField alloc] init];
textFidle.frame = CGRectMake(100, 100, 200, 40);
textFidle.backgroundColor = [UIColor grayColor];
[self.view addSubview:textFidle];
// 监听文本框的输入,而且只有大于3个长度的时候才会打印
[[textFidle.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
return value.length > 3;
}]
subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@", x);
}];
}
这里讲解一下代码
- textFidle.rac_textSignal这里会返回一个信号,直接订阅该信号就可以拿到输入框里的内容了
- 这里可以看到有一个新的东西filter,这个可以理解为筛选过滤的意思,需要返回一个bool值,即只有返回YES的时候subscribeNext,这个block才会调用,可以理解为只有给出通行证,才可以继续往下面执行,filter返回的还是一个RACSignal类
后续更新内容
- 结合实际开发场景,使用RAC解决输入框,按钮点击联动逻辑
- 组合信号的使用方法以及使用场景
- 快速解决多个任务需要按照顺序执行的需求
- 在开发中经常需要执行多个请求,然后再执行后续的任务(让你不再使用GCD中的任务调度组)
- 在开发中共需要按照顺序执行多个请求,帮助你更好的解决问题
- 网络请求的封装(RACCommand)
- 代理的使用方法
网友评论