ReactiveCocoa代替Target-Action

context

我们传统的使用 UIButton的方式,都是 Target-Action的方式. 但是有几个问题:

  1. 局部变量共享

    有个变量,我们需要在Action中使用,由于在 Target-Action的机制中,Action的参数撑死只能是sender, 所以,导致共享的方式,只能靠通过定义Property来实现 .这就需要程序员打断现有的思路,去定义Property . 对于一份有良好代码组织的代码(对不同种类的方法进行了种类划分的)就需要反复跳转去实现方法 .

  2. 代码阅读

    如第一条中所说, 编写代码的时候,尚且需要跳来跳去, 对新同事去接手代码,阅读成本更加高.

解决方案 without ReactiveCocoa

  1. 局部变量共享
    可以采用Runtime的方法,给NSObject添加一个属性,让Button带着内容进去Action

  2. 给Button添加自依赖,参考 我之前的博客

开发者都声称 Runtime是黑魔法 . 所以 …

ReactiveCocoa的解决

RACSignal 方式

[[self.button
   rac_signalForControlEvents:UIControlEventTouchUpInside]
   subscribeNext:^(id x) {
     NSLog(@"button clicked");
}];

以上是利用UI事件创建信号

RACCommand方式
RACCommand* aCommand =
       [[RACCommand alloc] initWithSignalBlock:^RACSignal*(id input) {

           return [RACSignal
               createSignal:^RACDisposable*(id<RACSubscriber> subscriber) {
                   NSLog(@"----");
                   [subscriber sendCompleted];
                   return nil;
               }];
       }];

   self.testButton.rac_command = aCommand;

根据官方文档来说, RACCommand 是对事件响应更官方的做法 ,而且,还可以通过 execute 手动执行.

[aCommand execute:nil]

RACSignal 的方式是简单易读.

两种方式可以根据实际需要选择 .

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容