https://www.jianshu.com/p/7562a30c24c5
此文章问转载, 原文地址如上
RACCommand作用:
RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程。
RACCommand使用场景:监听按钮点击,网络请求
简单实用实例
//1:创建命令 注意:command创建的block块返回值不能是nilRACCommand*command=[[RACCommand alloc]initWithSignalBlock:^RACSignal*_Nonnull(id _Nullable input){return[RACSignal createSignal:^RACDisposable*_Nullable(id<RACSubscriber>_Nonnull subscriber){//发送数据[subscriber sendNext:@"执行完命令之后产生的数据"];returnnil;}];}];//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:@"执行完命令之后产生的数据"];returnnil;}];}];//订阅信号//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];returnnil;}];}];//监听事件有没有执行完毕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.png
switchToLatest属性
//创建多个信号RACSubject*signalOfSignal=[RACSubjectsubject];RACSubject*signal1=[RACSubjectsubject];RACSubject*signal2=[RACSubjectsubject];RACSubject*signal3=[RACSubjectsubject];//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"];