ReactiveCocoa代替Target-Action

从入职新公司到现在, 都在给”友商”的硬件填坑 .什么RTSP,H264… 我和安卓小伙伴都快忘记自己是应用开发的了… 好在最近回过神来了. 继续可爱的 ReactiveCocoa

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 方式

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

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

RACCommand方式

1
2
3
4
5
6
7
8
9
10
11
12
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 手动执行.

1
[aCommand execute:nil]

RACSignal 的方式是简单易读.

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