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"];

整个流程如下

整个流程

写在最后:
希望这篇文章对您有帮助。当然如果您发现有可以优化的地方,希望您能慷慨的提出来。最后祝您工作愉快!

上一篇下一篇

猜你喜欢

热点阅读