美文网首页
RAC(Reactivecocoa)三之RACCommand流程

RAC(Reactivecocoa)三之RACCommand流程

作者: 留个念想给昨天 | 来源:发表于2018-09-05 17:51 被阅读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"];
    

    整个流程如下

    整个流程

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

    相关文章

      网友评论

          本文标题:RAC(Reactivecocoa)三之RACCommand流程

          本文链接:https://www.haomeiwen.com/subject/ibhnwftx.html