前端之家收集整理的这篇文章主要介绍了
ReactiveCocoa之RACCommand使用(五),
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
1.RACCommand:RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程。
2.使用场景:监听按钮点击,网络请求
RACCommand的简单使用
一、RACCommand使用步骤:
1.创建命令initWithSignalBlock:(RACSignal * (^)(idinput))signalBlock
2.在signalBlock中,创建RACSignal,并且作为signalBlock的返回值
3.执行命令- (RACSignal *)execute:(id)input
二、RACCommand使用注意:
1.signalBlock必须要返回一个信号,不能传nil.
2.如果不想要传递信号,直接创建空的信号[RACSignal empty];
3.RACCommand中信号如果数据传递完,必须调用[subscriber sendCompleted],这时命令才会执行完毕,否则永远处于执行中。
4.RACCommand需要被强引用,否则接收不到RACCommand中的信号,因此RACCommand中的信号是延迟发送的。
三、RACCommand设计思想:内部signalBlock为什么要返回一个信号,这个信号有什么用。
1.在RAC开发中,通常会把网络请求封装到RACCommand,直接执行某个RACCommand就能发送请求。
2.当RACCommand内部请求到数据的时候,需要把请求的数据传递给外界,这时候就需要通过signalBlock返回的信号传递了。
四、如何拿到RACCommand中返回信号发出的数据。
1.RACCommand有个执行信号源executionSignals,这个是signal of signals(信号的信号),意思是信号发出的数据是信号,不是普通的类型。
2.订阅executionSignals就能拿到RACCommand中返回的信号,然后订阅signalBlock返回的信号,就能获取发出的值。
五、监听当前命令是否正在执行executing
六、使用场景,监听按钮点击,网络请求
-
- -(void)test1{
- //RACCommand:处理事件
-
- //1.创建命令
- RACCommand*command=[[RACCommandalloc]initWithSignalBlock:^RACSignal*(idinput){
- //block调用,执行命令的时候就会调用
- NSLog(@"%@",input);
- //这里的返回值不允许为nil
- return[RACSignalcreateSignal:^RACDisposable*(id<RACSubscriber>subscriber){
- [subscribersendNext:@"执行命令产生的数据"];
- returnnil;
- }];
- }];
-
- //如何拿到执行命令中产生的数据呢?
- //订阅命令内部的信号
- //**方式一:直接订阅执行命令返回的信号
- //2.执行命令
- RACSignal*signal=[commandexecute:@2];
- //在这里就可以订阅信号了
- [signalsubscribeNext:^(idx){
-
- }
- //一般做法
- -(void)test2{
- //1.创建命令
- idinput){
- //block调用,执行命令的时候就会调用
- NSLog(@"%@",0); background-color:inherit">//input为执行命令传进来的参数
- //这里的返回值不允许为nil
- id<RACSubscriber>subscriber){
- [subscribersendNext:@"执行命令产生的数据"];
- nil;
- //方式二:
- //订阅信号
- //注意:这里必须是先订阅才能发送命令
- //executionSignals:信号源,信号中信号,signalofsignals:信号,发送数据就是信号
- [command.executionSignalsRACSignal*x){
- [xidx){
- //NSLog(@"%@",x);
- [command@2];
- }
- //高级做法
- void)test3{
- //block调用:执行命令的时候就会调用
- sendNext:@"发送信号"];
- //方式三
- //switchToLatest获取最新发送的信号,只能用于信号中信号。
- [command.executionSignals.switchToLatest@3];
- //switchToLatest
- void)test4{
- //创建信号中信号
- RACSubject*signalofsignals=[RACSubjectsubject];
- RACSubject*signalA=[RACSubjectsubject];
- //[signalofsignalssubscribeNext:^(RACSignal*x){
- //[xsubscribeNext:^(idx){
- //}];
- //}];
- //switchToLatest:获取信号中信号发送的最新信号
- [signalofsignals.switchToLatest//发送信号
- [signalofsignalssendNext:signalA];
- [signalAsendNext:@4];
- /*
- RACCommand通常用来表示某个Action的执行,比如点击Button。它有几个比较重要的属性:executionSignals/errors/executing。
- 1、executionSignals是signalofsignals,如果直接subscribe的话会得到一个signal,而不是我们想要的value,所以一般会配合switchToLatest。
- 2、errors。跟正常的signal不一样,RACCommand的错误不是通过sendError来实现的,而是通过errors属性传递出来的。
- 3、executing表示该command当前是否正在执行。
- */
- //监听事件有没有完成
- void)test5{
- //注意:当前命令内部发送数据完成,一定要主动发送完成
- //block调用:执行命令的时候就会调用
- //发送数据
- //***发送完成**
- sendCompleted];
- //监听事件有没有完成
- [command.executingif([xboolValue]==YES){
- NSLog(@"当前正在执行%@",108); list-style-type:decimal-leading-zero; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> }else{
- //执行完成/没有执行
- NSLog(@"执行完成/没有执行");
- //2.执行命令
- [command@1];
- }