RACCommand作用:
RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程。
RACCommand使用场景:监听按钮点击,网络请求
简单实用实例
//1:创建命令 注意:command创建的block块返回值不能是nil
RACCommand *command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//发送数据
[subscriber sendNext:@"执行完命令之后产生的数据"];
return nil;
}];
}];
//2:执行命令
RACSignal *signal = [command execute:@"输入指令"];
//3:订阅信号
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
通过executionSignals先订阅信号再执行命令
//command里面的信号可以被command的信号源所发送,即command.executionSignals的信号就是返回回来的信号,因为信号signal是一个对象,对象就可以通过数据的形式进行传输
//1.创建命令
RACCommand * command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
NSLog(@"%@",input);
//input:指令
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//发送数据
[subscriber sendNext:@"执行完命令之后产生的数据"];
return nil;
}];
}];
//订阅信号
//executionSignals:信号源!!,发送信号的信号!
[command.executionSignals subscribeNext:^(RACSignal * x) {
[x subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
NSLog(@"%@",x);
}];
//2.执行命令
[command execute:@"输入的指令!!"];
Snip20181105_16.png
监听事件有没有执行完毕
//RACCommand命令
//1.创建命令
RACCommand * command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
NSLog(@"%@",input);
//input:指令
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//发送数据
[subscriber sendNext:@"执行完命令之后产生的数据"];
//发送完成
[subscriber sendCompleted];
return nil;
}];
}];
//监听事件有没有执行完毕command.executing也是一个信号,这里也执行了信号的订阅
[command.executing subscribeNext:^(NSNumber * _Nullable x) {
if([x boolValue]){ //正在执行!!
NSLog(@"正在执行!!");
}else{
NSLog(@"已经结束咯&&还没开始做!");
}
}];
RACSignal * signal = [command execute:@"执行!!"];
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"接受到数据了!!%@",x);
}];
注意:必须加上[subscriber sendCompleted]发送完成,
Snip20181105_17.png Snip20181105_19.pngswitchToLatest属性
//创建多个信号
RACSubject * signalOfSignal = [RACSubject subject];
RACSubject * signal1 = [RACSubject subject];
RACSubject * signal2 = [RACSubject subject];
RACSubject * signal3 = [RACSubject subject];
//switchToLatest :最新的信号!!
[signalOfSignal.switchToLatest subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
//发送信号
[signalOfSignal sendNext:signal1];
[signalOfSignal sendNext:signal2];
[signalOfSignal sendNext:signal3];
//发送数据
[signal3 sendNext:@"3"];
[signal2 sendNext:@"2"];
[signal1 sendNext:@"1"];
Snip20181105_20.png
网友评论