RAC学习记录RACSignal(3)

1.RAC中RacsignalRACSignal的用法

- (void)signal
{
    RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
        NSLog(@"网络请求中..");
        [subscriber sendNext:@"111"];
        return nil;
    }];
    
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"-----%@",x);
    }];
    
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"-------%@",x);
    }];
}

调用流程

  RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
        NSLog(@"网络请求中..");
        [subscriber sendNext:@"111"];
        return nil;
    }];

会保存这个block到 RACDynamicSignaldidSubscribe的属性中

 [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"-----%@",x);
    }];

会保存这个block到RACSubscriber类的next属性中,然后再RACDynamicSignal类的subscribe方法中调用以前保存好的didSubscribe的block,且传入RACPassthroughSubscriber订阅者
调用didSubscribeblcok,会通过RACScheduler这个类去调度

  NSLog(@"网络请求中..");
  [subscriber sendNext:@"111"];  
  return nil;

subscriber 也就是RACPassthroughSubscriber对象,[self.innerSubscriber sendNext:value]; innerSubscriber也就是保存nextblock属性的RACSubscriber对象,在调用

    @synchronized (self) {
        void (^nextBlock)(id) = [self.next copy];
        if (nextBlock == nil) return;

        nextBlock(value);
    }
}

nextblock 也就执行了

2.为什么sendCompletedsendError 后面再sendNext,却不会执行了nextblock
通过看sendCompletedsendError实现方法得知

- (void)sendError:(NSError *)e {
    @synchronized (self) {
        void (^errorBlock)(NSError *) = [self.error copy];
        [self.disposable dispose];

        if (errorBlock == nil) return;
        errorBlock(e);
    }
}

订阅者被销毁了。

3.RACSignal会产生副作用
每订阅一次,就会执行didSubscribeblock,也就会打印执行网络请求,在做网络请求的时候,我们是不希望的每订阅一次,执行网络请求的

解决副作用的方法如下

- (void)muilticas
{
    /// 解决多次订阅的问题,。 `副作用`
    RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
        NSLog(@"发送网络请求");
        [subscriber sendNext:@"111"];
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"销毁啦");
        }];
    }];
    
    RACMulticastConnection *connect = [signal publish];

    [connect.signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"1======%@",x);
    }];
    
    [connect.signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"2======%@",x);
    }];
    
    [connect connect];
}

调用流程就不讲了,涉及到RACSubject

你可能感兴趣的:(RAC学习记录RACSignal(3))