RAC(Reactivecocoa)三之RACCommand流程
2018-09-05 本文已影响0人
留个念想给昨天
RAC之RACCommand的流程分析
初识 RACCommand
创建 RACCommand
RACCommand的创建有两种形式:
- (id)initWithSignalBlock:(RACSignal * (^)(id input))signalBlock;
- (id)initWithEnabled:(RACSignal *)enabledSignal signalBlock:(RACSignal * (^)(id input))signalBlock;
第二种相对于第一种多了一个能传递BOOL事件的RACSignal,这个signal的作用相当于过滤,当传递的布尔事件为真值时,command能够执行,反之则不行。
共有的signalBlock通过传进一个用于构建RACSignal的block参数来初始化RACCommand,而block中的参数input为执行command时传入的数据,另外,创建出的signal可在里面完成一些数据操作,如网络请求,本地数据库读写等等。
第一种RACCommand的代码
1. RACCommand的创建
RACCommand* command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
NSLog(@"input == %@",input);
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"开始执行网络");
sleep(1);
[subscriber sendNext:@"回来"];
NSError* error = [NSError errorWithDomain:NSURLErrorDomain code:10087 userInfo:@{@"errorinfo":@"自己查"}];
[subscriber sendError:error];
return [RACDisposable disposableWithBlock:^{
NSLog(@"销毁了");
}];
}];
}];
2订阅 RACCommand
2.1 订阅是否有信号执行
每次信号开始或者结束的时候会调用
[command.executing subscribeNext:^(NSNumber * _Nullable x) {
NSLog(@"是否正在执行:%@",x);
}];
2.2失败信号的订阅
这个信号就是创建RACCommand时传入的signalBlock中的相关信号(sendError:)
[command.errors subscribeNext:^(NSError * _Nullable x) {
NSLog(@"error:%@",x);
}];
2.3获取command中的信号----信号源(信号中的信号)
command.executionSignals为command的信号源,这个信号源就是创建RACCommand时signalBlock中return的内容,也是一个信号。
[command.executionSignals subscribeNext:^(id x) {
[x subscribeNext:^(id x1) {
NSLog(@"%@",x1);
}];
}];
而x和x1如下图
x和x1如何更简单的获取command中的信号?
switchToLatest:用于signal of signals,获取signal of signals发出的最新信号,也就是可以直接拿到RACCommand中的信号
[[command.executionSignals switchToLatest] subscribeNext:^(id _Nullable x) {
NSLog(@"executionSignals==%@",x);
}];
这个x直接就为command信号中的信号的内容回来
。
注意:这里确实有点绕,最好拿到实际代码操作几遍。
3执行 RACCommand
传入的value会传入到创建RACCommand是signalBlock传的参数
[command execute:@"NSLog"];
整个流程如下
整个流程写在最后:
希望这篇文章对您有帮助。当然如果您发现有可以优化的地方,希望您能慷慨的提出来。最后祝您工作愉快!