RACCommand粗解

迷之RACCommand

RACCommand 最常用于两个地方,监听按钮点击,网络请求
说实在就是一个执行方法的Block

1 按钮点击,使用 RAC 有两种方式

  • UIControl+RACSignalSupport
1
2
3
//返回一个Signal

- (RACSignal *)rac_signalForControlEvents:(UIControlEvents)controlEvents;
  • UIButton+RACCommandSupport
1
2
3
//定义一个属性(类似Block)

@property(nonatomic, strong) RACCommand *rac_command;

2. 使用SignalForControlEvents来触发

(方法只要点击就触发,等于addTarget)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

// 按钮是否可点击
RAC(self.commandBtn, enabled) = validSignal;

[[[self.commandBtn rac_signalForControlEvents:UIControlEventTouchUpInside]

// flattenMap 生成新的信号,在信号中可以处理点击事件,并发送结果
//flattenMap map 用于把源信号内容映射成新的内容。

flattenMap:^RACStream *(id value) {
return [self btnClickSignal];
}] subscribeNext:^(id x) {
NSLog(@"====%@", x); // ====按钮点击了
}];

- (RACSignal *)btnClickSignal {

return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

/**
* 这里可以进行处理按钮点击后的事件,并把想要的结果传递出去
*/
[subscriber sendNext:@"按钮点击了"];

[subscriber sendCompleted];

return nil;
}];
}
  • 上述就是根据 UIControl 的分类信息,进行处理按钮点击事件的第一种方式。但是有一个问题
    • 只有手动点击了按钮,并且是 UIControlEventTouchUpInside 的事件状态下才会执行 block 中的代码。
    • 如果需要主动触发事件呢,而在老代码中,可以手动调用 [self btnClick] ,所以就必须使用第二种方式, RACCommand

3. RACCommand

  • 初始化 rac_command
1
2
3
4
5
6
7
8
9

// 初始化 command, enabled 表示按钮可否点击
RACCommand *command = [[RACCommand alloc] initWithEnabled:validSignal signalBlock:^RACSignal *(id input) {

return [self btnClickSignal];

}];

self.commandBtn.rac_command = command;

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×