RACCommand一般用来处理事件,监听按钮点击,网络请求等。
先看下RACCommand简单使用
RACCommand的使用很简单,就两步
1:创建命令
RACCommand *command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
// 这里必须返回一个信号,不能返回为nil,会崩溃
// 如果不想传递信号,可以发出空信号 [RACSignal empty];
// block调用时刻: [command execute:@1];
NSLog(@"请求网络数据%@",input);
// 请求网络数据完毕,怎么将网络产生的数据发送出去呢?
// 怎么发送? 就得靠下面这个RACSignal去发送,只要有人订阅了RACSignal,RACSignal数据就发送得出去
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"发送网络数据”];
//如果不再继续发送数据,要发送完成信号
[subscriber sendCompleted];
return nil;
}];
}];
2:执行命令
[command execute:@1];
如何订阅命令中的RACSignal信号呢?
有三种方法
- 方法一,最简单的一种
你们查看 execute: 方法,它返回的就是一个RACSignal
- (RACSignal *)execute:(id)input
所以,我们可以直接订阅这个返回来的RACSignal
RACSignal *signal = [command execute:@1];
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
- 方法二,稍微复杂点
RACCommand 中有个属性executionSignals,它表示信号中的信号。
对了,这里有个要注意的地方,方法二必须要在执行命令execute之前执行
// 看打印结果可知,command.executionSignals 拿到的是一个RACSignal
[command.executionSignals subscribeNext:^(RACSignal * x) {
NSLog(@"%@",x); // x == RACDynamicSignal
[x subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
}];
[command execute:@1];
- 方法三,高级用法
switchToLatest 获取最新发送的信号,只能用于信号中的信号
[command.executionSignals.switchToLatest subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[command execute:@1];
RACCommand还有一个比较好用的属性,executing,它用来监听事件有没有完成
比如:当你点击一个按钮访问网络的时候,你总不能每次点的时候都访问网络吧,肯定要等网络处理完成之后才能继续点,这个时候,你就可以用到这个属性
// executing 直接返回一个 RACSignal
@property (nonatomic, strong, readonly) RACSignal<NSNumber *> *executing;
// 监听事件有没有完成,
[command.executing subscribeNext:^(NSNumber * _Nullable x) {
if ([x boolValue] == YES) {
NSLog(@"当前正在执行");
}
else {
NSLog(@"执行完成/没有执行");
}
}];