RAC指的就是Reactivecocoa,用于iOS开发和OS开发,是git上面的一个开源框架,可以使用pod直接导入。RAC讲究的是万物皆信号,可替代:代理、通知、Block、KVO以及事件绑定。OC—— ‘ReactiveObjC’,Swift——Reactivecocoa。当前项目使用OC。RAC之前也使用过配合MVVM设计,但是用的功能少。当前公司采用RAC也是配合MVVM,使用的比较多,同事也不是很熟,用的比较乱。所以研究整理RAC使用方法,特此记录。如有不对之处欢迎留言指出。
对应地方导入:<ReactiveObjC/ReactiveObjC.h>
RAC----类目介绍
1,RACSignal:信号类,本身不具备发送信号能力。信号发送携带数据,当数据改变就发送数据。
2,RACSubject:信号类,继承RACSignal,可以手动控制,有发送信号能力。
3,RACReplaySubject:RACSubject子类,可以先发送信号再订阅。
4,RACSubscriber:可以接受发送信号的协议对象,表示信号订阅者。本身是一个协议,不是一个类。
5,RACDisposable:用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。
6,RACCommand:事件类,一般使用此类来进行网络请求,获取数据事件传递。
RAC-----宏介绍
@strongify @weakify注意配对使用,类似强弱转换。解决循环引用问题。独立使用@weakify而在RAC Block中不使用 @strongify 会造成内存泄漏。因为仅用@weakify后,使用的self本非弱化后的self,而是self本身。
RAC(TARGET, …),用于事件绑定,为对象属性指定信号,自动设置给定的键。
RACObserve(TARGET, KEYPATH):创建一个在“TARGET”上观察“KEYPATH”以获取更改的信号,一般用于多个事件绑定之间作为信号。
本人很少使用的宏
RACTuplePack:把数据包装成RACTuple(元组类)。
RACTupleUnpack:把RACTuple(元组类)解包成对应的数据。
RAC:方法关键字段介绍
1,skip:跳过信号 跳过第一次信号。
2,concat:按一定顺序拼接信号,当多个信号发出的时候,有顺序的接收信号。
3,then:用于连接两个信号,当第一个信号完成,才会连接then返回的信号。
4,merge:把多个信号合并为一个信号,任何一个信号有新值的时候就会接受信号。
5,combineLatest:把多个信号合并为一个信号,所有信号发出新值时才会接受到信号。
6,reduce:用于信号发出的内容是元组,把信号发出元组的值聚合成一个值。
7,filter:过滤信号ignore过滤特定条件,take只接受几次信号。
8,bind:底层方法,操作核心。进行信号绑定,信号发送数据,就能监听到。
用法介绍
RACSignal:创建一个信号
RACSignal *siganal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"发送数据"];
[subscriber sendCompleted]; //数据发送完要调用sendCompleted,信号才会销毁
// NSError *error = [NSError new];
// [subscriber sendError:error]; //error会自动销毁信号
return [RACDisposable disposableWithBlock:^{
NSLog(@"信号被销毁");
}];
}];
[siganal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x); //接受数据
}];
RACCommand: 创建
` self.command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// input为传入的参数
[subscriber sendNext:@"发送数据"]; //
// NSError *error = [NSError new];
// [subscriber sendError:error]; 发送error会自动调用
[subscriber sendCompleted];//每次都会创建一个信号,发送完数据,此处记得销毁消息,不然会一直处于执行中。
return [RACDisposable disposableWithBlock:^{
NSLog(@"信号被销毁");
}];
}];
}];
[self.command.executionSignals subscribeNext:^(NSString * x) {
NSLog(@"获取一个信号---%@",x);
}];
[self.command.executing subscribeNext:^(NSNumber * _Nullable x) {
NSLog(@"监听完成---%@",x); //x为监听状态 0代表执行完毕,1代表执行中
}];
[self.command.errors subscribeNext:^(NSError * _Nullable x) {
NSLog(@"错误"); // 接受错误信息
}];
[self.command.executionSignals.switchToLatest subscribeNext:^(id _Nullable x) {
NSLog(@"接受信号中的信号x为数据:%@",x);//x为发送的数据
}];
[self.command execute:@"11111"]; //调用command`
数据绑定
RAC把基本控件都做了扩展分类,使用时直接可以调用rac_signalFor 绑定对应事件,使用非常方便。
绑定:宏RAC`RAC(对象, 属性) = 事件;`
监听`[RACObserve(对象, 属性) subscribeNext:^(id _Nullable x) {
@strongify(self)改变时做相应操作
}]`
联合使用
`[[RACObserve(对象, 属性) skip:1] subscribeNext:^(NSString* _Nullable value) { //监听属性,
//skip跳过第一次
}]
[RACSignal combineLatest:@[RACObserve(self, 属性1),RACObserve(selfl, 属性2)] reduce:^id _Nullable(NSString *realName ,NSString *cardNo){
//combineLatest 将属性1和2同时监听,,所有信号发出新值时才会触发信号
//关键字为merge 是任意值改变就会触发信号
}]
[[siganal filter:^BOOL(id _Nullable value) {
return value; //执行过滤条件
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x); //接受数据
}]; [[siganal ignore:@"发送数据"] subscribeNext:^(id _Nullable x) {
NSLog(@"1111%@",x); //接受数据 过滤特定条件
}];
[[siganal take:4] subscribeNext:^(id _Nullable x) {
NSLog(@"1111%@",x); //只接受4次信号,之后就不再接受信号
}];`
RAC是一个非常强大的框架,对于一些逻辑,事件监听能很大帮助我们解决一些需要写很多逻辑代码才能完成的事情,对于系统本来很简单的操作就没必要到处使用RAC而搞得复杂。上面就是RAC的简单介绍以及基本使用,希望能帮助到大家理解。如有理解不对或者建议欢迎大家留言。