ReactiveCocoa之RACCommand使用(五)

前端之家收集整理的这篇文章主要介绍了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

六、使用场景,监听按钮点击,网络请求

[objc]@H_251_301@ view plain copy
  1. //普通做法
  2. -(void)test1{
  3. //RACCommand:处理事件
  4. //不能返回空的信号
  5. //1.创建命令
  6. RACCommand*command=[[RACCommandalloc]initWithSignalBlock:^RACSignal*(idinput){
  7. //block调用,执行命令的时候就会调用
  8. NSLog(@"%@",input);//input为执行命令传进来的参数
  9. //这里的返回值不允许为nil
  10. return[RACSignalcreateSignal:^RACDisposable*(id<RACSubscriber>subscriber){
  11. [subscribersendNext:@"执行命令产生的数据"];
  12. returnnil;
  13. }];
  14. }];
  15. //如何拿到执行命令中产生的数据呢?
  16. //订阅命令内部的信号
  17. //**方式一:直接订阅执行命令返回的信号
  18. //2.执行命令
  19. RACSignal*signal=[commandexecute:@2];//这里其实用到的是replaySubject可以先发送命令再订阅
  20. //在这里就可以订阅信号了
  21. [signalsubscribeNext:^(idx){
  22. }
  23. //一般做法
  24. -(void)test2{
  25. //1.创建命令
  26. idinput){
  27. //block调用,执行命令的时候就会调用
  28. NSLog(@"%@",0); background-color:inherit">//input为执行命令传进来的参数
  29. //这里的返回值不允许为nil
  30. id<RACSubscriber>subscriber){
  31. [subscribersendNext:@"执行命令产生的数据"];
  32. nil;
  33. //方式二:
  34. //订阅信号
  35. //注意:这里必须是先订阅才能发送命令
  36. //executionSignals:信号源,信号中信号,signalofsignals:信号,发送数据就是信号
  37. [command.executionSignalsRACSignal*x){
  38. [xidx){
  39. //NSLog(@"%@",x);
  40. [command@2];
  41. }
  42. //高级做法
  43. void)test3{
  44. //block调用:执行命令的时候就会调用
  45. sendNext:@"发送信号"];
  46. //方式三
  47. //switchToLatest获取最新发送的信号,只能用于信号中信号。
  48. [command.executionSignals.switchToLatest@3];
  49. //switchToLatest
  50. void)test4{
  51. //创建信号中信号
  52. RACSubject*signalofsignals=[RACSubjectsubject];
  53. RACSubject*signalA=[RACSubjectsubject];
  54. //[signalofsignalssubscribeNext:^(RACSignal*x){
  55. //[xsubscribeNext:^(idx){
  56. //}];
  57. //}];
  58. //switchToLatest:获取信号中信号发送的最新信号
  59. [signalofsignals.switchToLatest//发送信号
  60. [signalofsignalssendNext:signalA];
  61. [signalAsendNext:@4];
  62. /*
  63. RACCommand通常用来表示某个Action的执行,比如点击Button。它有几个比较重要的属性:executionSignals/errors/executing。
  64. 1、executionSignals是signalofsignals,如果直接subscribe的话会得到一个signal,而不是我们想要的value,所以一般会配合switchToLatest。
  65. 2、errors。跟正常的signal不一样,RACCommand的错误不是通过sendError来实现的,而是通过errors属性传递出来的。
  66. 3、executing表示该command当前是否正在执行。
  67. */
  68. //监听事件有没有完成
  69. void)test5{
  70. //注意:当前命令内部发送数据完成,一定要主动发送完成
  71. //block调用:执行命令的时候就会调用
  72. //发送数据
  73. //***发送完成**
  74. sendCompleted];
  75. //监听事件有没有完成
  76. [command.executingif([xboolValue]==YES){//正在执行
  77. 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{
  78. //执行完成/没有执行
  79. NSLog(@"执行完成/没有执行");
  80. //2.执行命令
  81. [command@1];
  82. }

猜你在找的React相关文章