context
我们传统的使用 UIButton
的方式,都是 Target-Action
的方式. 但是有几个问题:
-
局部变量共享
有个变量,我们需要在Action中使用,由于在
Target-Action
的机制中,Action
的参数撑死只能是sender
, 所以,导致共享的方式,只能靠通过定义Property来实现 .这就需要程序员打断现有的思路,去定义Property . 对于一份有良好代码组织的代码(对不同种类的方法进行了种类划分的)就需要反复跳转去实现方法 . -
代码阅读
如第一条中所说, 编写代码的时候,尚且需要跳来跳去, 对新同事去接手代码,阅读成本更加高.
解决方案 without ReactiveCocoa
局部变量共享
可以采用Runtime
的方法,给NSObject添加一个属性,让Button带着内容进去Action给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 的方式是简单易读.
两种方式可以根据实际需要选择 .