用法:一般处理事件,比如处理按钮点击事件等等,都是创建命令类
RACCommand是在execute时候传入数据,在创建的时候进行相应的数据操作,和RACSignal相当于是相反的,因为RACSignal是在创建的时候传出数据,在订阅的时候接受数据进行操作。
1,第一种获取command内部信号的方式:直接在执行命令的时候获取返回值
//1,创建命令,在接受到传进来的数据后做相应处理,然后再传出去其他地方
//注意:command创建的时候内部不能为空
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@"接受到数据---%@",input);
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//想要接受再次传出去的数据是需要订阅command内部的信号,订阅方式有两种,如下是第一种:
NSLog(@"可以在这里做相应的处理,然后再传出去,传出的数据是----%@",input);
[subscriber sendNext:input];
//也是不行,无法监听任务完成状态
[subscriber sendCompleted];
return nil;
}];
}];
//最好先监听,然后再执行命令,不然可能会有问题
//4,监听command内部处理是否完成,之前的第一种订阅方式也是一样可以用这个方法的
[command.executing subscribeNext:^(id x) {
if ([x boolValue] == YES) {
NSLog(@"任务正在执行中");
}else{
NSLog(@"不在执行中");
}
}];
//2,执行命令,传入数据到command中做相应的处理
//第一种获取command内部信号的方式:直接在执行命令的时候获取返回值
RACSignal *signal = [command execute:@"执行命令的数据"];
//3,订阅command内部的信号,获取command传出来的数据(这个方式只能先执行,后订阅)
[signal subscribeNext:^(id x) {
NSLog(@"外部 --- %@",x);
}];
- 2,第二种获取command内部信号的方式:利用信号源也就是信号的信号
//1,创建命令,在接受到传进来的数据后做相应处理,然后再传出去其他地方
//注意:command创建的时候内部不能为空
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@"接受到数据---%@",input);
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//想要接受再次传出去的数据是需要订阅command内部的信号,订阅方式有两种,如下是第二种:
NSLog(@"可以在这里做相应的处理,然后再传出去,传出的数据是----%@",input);
[subscriber sendNext:@"zhangdanfeng"];
//这个方法好像不太管用
[subscriber sendCompleted];
return nil;
}];
}];
//2,订阅command内部的信号,获取command传出来的数据(这种方式只能先订阅,后执行命令)
/*
//第二种获取command内部信号的方式:利用信号源也就是信号的信号
[command.executionSignals subscribeNext:^(RACSignal *x) {
//这里的x就是我们需要的信号,也就是command内部的信号
[x subscribeNext:^(id x) {
NSLog(@"外部-----%@",x);
}];
}];
*/
//以上第二步订阅信号的简化方法,switchToLatest,把信号中的信号,转化成最高层的信号直接可可以订阅即可
[command.executionSignals.switchToLatest subscribeNext:^(id x) {
NSLog(@"外部-----%@",x);
}];
//最好先监听,然后再执行命令,不然可能会有问题
//4,监听command内部处理是否完成,之前的第一种订阅方式也是一样可以用这个方法的
[command.executing subscribeNext:^(id x) {
if ([x boolValue] == YES) {
NSLog(@"任务正在执行中");
}else{
NSLog(@"不在执行中");
}
}];
//3,执行命令,传入数据到command中做相应的处理
[command execute:@"执行命令的数据"];
存在问题:监听任务是否进行的时候,在任务完成之后不能监听!!!暂时没有找到解决办法。
原理分析:绑定方法
- 1
//1,创建信号(相当于创建命令command)
RACSubject *subject = [RACSubject subject];
//2,绑定信号(相当于创建命令command)
RACSignal *bindSignal = [subject bind:^RACStreamBindBlock{
return ^RACSignal *(id value, BOOL *stop){
//value就是传进来的数据
NSLog(@"%@", value);
//把数据传出去
return [RACSignal return:value];
};
}];
//3,订阅信号,在外部接受从里面发送出来的数据(相当于订阅命令内部信号)
[bindSignal subscribeNext:^(id x) {
NSLog(@"外部----%@", x);
}];
//4,发送数据(相当于执行命令)
[subject sendNext:@"发送的原始数据"];