一、导图
概要二、具体实现
代码地址:https://github.com/lionsom/LXReactiveCocoa_Demo
1、场景一:rac_liftSelector
当需要发送多个网络请求,并且每个网络请求成功之后才能够进行页面加载的情况。
解决方案:rac_liftSelector
-(void)demo_2 {
//请求1
RACSignal * signal_1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//发送信号
NSLog(@"发送网络数据");
//发送数据
[subscriber sendNext:@"数据1 来了!!"];
return nil;
}];
//请求2
RACSignal * signal_2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//发送信号
NSLog(@"发送网络数据");
//发送数据
[subscriber sendNext:@"数据2 来了!!"];
return nil;
}];
//数组:存放信号
//当数组中的所有信号都发送了数据,才会执行selector
//参数:必须和数组的信号一一对应
//参数:就是每一个信号发送的数据
[self rac_liftSelector:@selector(updateUI::) withSignalsFromArray:@[signal_1,signal_2]];
}
//页面刷新
-(void)updateUI:(NSString *)data1 :(NSString *)data2 {
NSLog(@"updateUI == %@ == %@",data1,data2);
}
2、场景二:RACMulticastConnection连接类
当同一个信号被多次订阅的时候,信号就会发送多次相同的请求。很明显是不合理的。
样例代码:
RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//发送网络请求
NSLog(@"发送请求");
//发送请求到的数据
[subscriber sendNext:@"请求到数据!!"];
return nil;
}];
//订阅信号1
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"AA 处理数据%@",x);
}];
//订阅信号2
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"BB 处理数据%@",x);
}];
运行结果:**相同的网络请求,请求了两次**
解决方案:RACMulticastConnection
//不管订阅多少信号,就只会请求一次数据
//RACMulticastConnection连接类:用于 当一个信号被多次订阅的时候,避免多次请求数据、、
//1、创建信号
RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//发送网络请求
NSLog(@"发送请求");
//发送请求到的数据
[subscriber sendNext:@"请求到数据!!"];
return nil;
}];
//2、将信号转成一个连接类
RACMulticastConnection * connection = [signal publish];
//3、订阅信号
[connection.signal subscribeNext:^(id _Nullable x) {
NSLog(@"AA 处理数据%@",x);
}];
[connection.signal subscribeNext:^(id _Nullable x) {
NSLog(@"BB 处理数据%@",x);
}];
//4、链接
[connection connect];
运行结果:**只请求一遍数据,两个地方都可以用**
3、场景三:RACCommand
RACCommand可以对一个事件进行控制和操作,具体看下代码:对于命令处理到哪一步进行监听。
// RACCommand 命令 == 对事件的一个操作
//1、创建命令
RACCommand * command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
//input : 指令
NSLog(@"%@",input);
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//发送数据
[subscriber sendNext:@"执行完命令之后产生的数据"];
//发送完成
[subscriber sendCompleted];
return nil;
}];
}];
//监听事件有没有执行完毕
[command.executing subscribeNext:^(NSNumber * _Nullable x) {
if ([x boolValue]) {
NSLog(@"正在执行");
}else{
NSLog(@"已经结束了&&还没开始做");
}
}];
//2、执行命令
RACSignal * signal = [command execute:@"执行命令参数"];
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"接收到了数据了:%@",x);
}];
运行结果:**对于事件处理到了哪一步都可以进行查看**
介绍一个RACCommand类的对象switchToLatest
switchToLatest : 最新的信号
//创建多个信号
RACSubject * signalOfSignal = [RACSubject subject];
RACSubject * signal_1 = [RACSubject subject];
RACSubject * signal_2 = [RACSubject subject];
//订阅信号 switchToLatest:最新的信号
[signalOfSignal.switchToLatest subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
//发送信号
[signalOfSignal sendNext:signal_1];
[signalOfSignal sendNext:signal_2];
[signal_1 sendNext:@"1"];
[signal_2 sendNext:@"2"];
看输出结果:signal_2 是最新的信号
4、场景四:bind
//bind
//1、创建信号
RACSubject * subject = [RACSubject subject];
//2、绑定信号
RACSignal * bindSignal = [subject bind:^RACSignalBindBlock _Nonnull{
return ^RACSignal * (id value, BOOL * stop) {
NSLog(@"AAAA == %@",value);
//block调用:只要源信号发送数据,就会调用bindBlock
//block作用:处理源信号内容
//返回信号,不能传nil,返回空信号:[RACSignal empty]
// return [RACSignal empty];
return [RACReturnSignal return:value];
};
}];
//3、订阅信号
[bindSignal subscribeNext:^(id _Nullable x) {
NSLog(@"BBB == %@",x);
}];
//4、发送数据
[subject sendNext:@"发送原始的数据"];
网友评论