RACCommand
RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程。 使用场景:监听按钮点击,网络请求。
RACCommand
使用步骤:- 创建命令
initWithSignalBlock:(RACSignal * (^)(id input))signalBlock
; - 在
signalBlock
中,创建RACSignal
,并且作为signalBlock
的返回值; - 执行命令
-(RACSignal *)execute:(id)input
;
- 创建命令
RACCommand
使用注意:signalBlock
必须要返回一个信号,不能传nil
.- 如果不想要传递信号,直接创建空的信号
[RACSignal empty]
; RACCommand
中信号如果数据传递完,必须调用[subscriber sendCompleted]
,这时命令才会执行完毕,否则永远处于执行中。RACCommand
需要被强引用,否则接收不到RACCommand
中的信号,因此RACCommand
中的信号是延迟发送的。
//创建命令
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
//block调用,执行命令的时候就会调用
NSLog(@"input:%@",input); // input 为执行命令传进来的参数
// 这里的返回值不允许为nil
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"执行命令产生的数据"];
return nil;
}];
}];
// 如何拿到执行命令中产生的数据呢?
// 订阅命令内部的信号:
// ** 方式一:直接订阅执行命令返回的信号
// 2.执行命令
RACSignal *signal =[command execute:@2]; // 这里其实用到的是replaySubject 可以先发送命令再订阅
// 在这里就可以订阅信号了
[signal subscribeNext:^(id x) {
NSLog(@"x:%@",x);
}];
// ** 方式二:直接订阅执行命令返回的信号
// 订阅信号, 注意:这里必须是先订阅才能发送命令
// executionSignals:信号源,信号中信号,signalofsignals:信号,发送数据就是信号
[command.executionSignals subscribeNext:^(RACSignal *x) {
[x subscribeNext:^(id x) {
NSLog(@"x1:%@", x);//后打印,一个对象
}];
NSLog(@"x2:%@", x); //先打印,一个信号
}];
// 2.执行命令
[command execute:@2];
// ** 方式三:
// switchToLatest获取最新发送的信号,只能用于信号中信号。
[command.executionSignals.switchToLatest subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 2.执行命令
[command execute:@3];
RACCommand 通常用来表示某个Action的执行,比如点击Button。它有几个比较重要的属性:
executionSignals
/errors
/executing
。executionSignals
是signalOfSignals
,如果直接subscribe
的话会得到一个signal
,而不是我们想要的value
,所以一般会配合switchToLatest
。errors
跟正常的signal
不一样,RACCommand
的错误不是通过sendError
来实现的,而是通过errors
属性传递出来的。executing
表示该command
当前是否正在执行。RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) { NSLog(@"%@",input); return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@"执行命令产生的数据"]; [subscriber sendCompleted]; return [RACDisposable disposableWithBlock:^{ NSLog(@"信号源注销..."); }]; }]; }]; //监听事件有没有完成 [command.executing subscribeNext:^(id x) { if ([x boolValue] == YES) { NSLog(@"正在执行:%@",x); }else{ NSLog(@"执行完成/没有执行"); } }]; [command execute:@"Jon Snow"];