美文网首页
RAC学习记录RACSignal(3)

RAC学习记录RACSignal(3)

作者: 宋鸿康iOS | 来源:发表于2019-08-25 20:25 被阅读0次

    1.RAC中RacsignalRACSignal的用法

    - (void)signal
    {
        RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _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<RACSubscriber>  _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<RACSubscriber>  _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)

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