RACCommand
RACCommand:RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递包装到这个类中,它可以很方便的监控事件的执行过程。
使用场景:监听按钮点击事件,网络请求;
使用步骤:
1.创建命令:
RACCommand不能返回一个空的信号:
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
//input为执行命令时传递的参数
NSLog(@"%@",input);
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//执行完命令后,在这里发送数据
[subscriber sendNext:@"拿到网络数据"];
returnnil;
}];
}];
2.执行命令:
RACSignal *signal = [command execute:@100];
如何拿到执行命令产生的数据呢?需要订阅命令内部的信号
3.订阅信号
方法有三种:
1利用执行命令返回的信号进行订阅:
[signal subscribeNext:^(id _Nullablex) {
NSLog(@"%@",x);
}];
注意:这种方式可以在执行之后订阅;
2.executionSignals为命令的信号源(信号中的信号),我们订阅它会返回命令中返回的信号:
[command.executionSignals subscribeNext:^(id _Nullable x) {
RACSignal*signal = x;
[signalsubscribeNext:^(id _Nullabledata) {
NSLog(@"%@",data);
}];
}];
注意:这种方式必须在执行之前订阅;
3.switchToLatest获取最新发送的信号,只能用于信号中的信号
[command.executionSignals.switchToLatest subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
4.executing
[command.executing subscribeNext:^(NSNumber * _Nullable x) {
if([x boolValue]) {//当前正在执行
NSLog(@"当前正在执行");
}else{
NSLog(@"执行完成或没有执行");
}
}];
executing可以监控命令的执行,block返回值是一个NSNumber类型的布尔值,YES代表正在执行,NO代表执行完成或没有执行,在一执行subscribeNext就会执行没有执行的代码,[subscriber sendCompleted];执行完成之后会调用执行完成的代码;