ReactiveCocoa源码分析02 -- RACComman

2022-03-16  本文已影响0人  YanZi_33
RACCommand
_executionSignals = [[[self.addedExecutionSignalsSubject
        map:^(RACSignal *signal) {
            return [signal catchTo:[RACSignal empty]];
        }]
        deliverOn:RACScheduler.mainThreadScheduler]
        setNameWithFormat:@"%@ -executionSignals", self];
_executing = [[[[[immediateExecuting
        deliverOn:RACScheduler.mainThreadScheduler]
        // This is useful before the first value arrives on the main thread.
        startWith:@NO]
        distinctUntilChanged]
        replayLast]
        setNameWithFormat:@"%@ -executing", self];
_immediateEnabled = [[[[RACSignal
        combineLatest:@[ enabledSignal, moreExecutionsAllowed ]]
        and]
        takeUntil:self.rac_willDeallocSignal]
        replayLast];
    
    _enabled = [[[[[self.immediateEnabled
        take:1]
        concat:[[self.immediateEnabled skip:1] deliverOn:RACScheduler.mainThreadScheduler]]
        distinctUntilChanged]
        replayLast]
        setNameWithFormat:@"%@ -enabled", self];
RACMulticastConnection *errorsConnection = [[[self.addedExecutionSignalsSubject
        flattenMap:^(RACSignal *signal) {
            return [[signal
                ignoreValues]
                catch:^(NSError *error) {
                    return [RACSignal return:error];
                }];
        }]
        deliverOn:RACScheduler.mainThreadScheduler]
        publish];
    
    _errors = [errorsConnection.signal setNameWithFormat:@"%@ -errors", self];
    [errorsConnection connect];
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    RACCommand *command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
        NSLog(@"执行1");
        //创建一个一阶信号 此信号会传递给RACCommand内部属性executionSignals
        RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            NSLog(@"执行3");
            [subscriber sendNext:input];
            return nil;
        }];
        return signal;
    }];
    
    //一阶信号 -- 信号内容(具象数据)
    //二阶信号 -- 信号内容(一阶信号)
    //command.executionSignals是一个高阶信号
    //订阅command的executionSignals信号
    [command.executionSignals subscribeNext:^(id  _Nullable x) {
        //x是接收的信号内容 是一个一阶信号
        [x subscribeNext:^(id  _Nullable x) {
           NSLog(@"执行4");
           NSLog(@"接收数据 -- %@",x);
        }];
        NSLog(@"执行2");
    }];
    
    //订阅command的executing信号
    [command.executing subscribeNext:^(NSNumber * _Nullable x) {
        NSLog(@"executing == %@",x);
    }];

    //订阅command的error信号
    [command.errors subscribeNext:^(NSError * _Nullable x) {
        NSLog(@"errors == %@",x);
    }];

    [command execute:@"发送消息"];
}
@end
image.png image.png image.png image.png
上一篇下一篇

猜你喜欢

热点阅读