美文网首页
RAC实战1---信号的创建、订阅、发送

RAC实战1---信号的创建、订阅、发送

作者: 小怪兽鱼小宝 | 来源:发表于2019-04-20 01:24 被阅读0次

    我们先从创建一个信号开始说起吧

    //1创建信号
    //createSignal的参数是个block,block的返回值是个RACDisposable类型的对象。参数是满足RACSubscriber协议的对象subscriber.
    RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
    
        NSLog(@"创建信号量");
        //3、发布信息
        [subscriber sendNext:@"I'm send next data"];
        
        NSLog(@"那我啥时候运行");
        
        return nil;
    }];
    
    //2、订阅信号量
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    

    进入createSignal看看

    + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
        return [RACDynamicSignal createSignal:didSubscribe];
    }
    + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
        RACDynamicSignal *signal = [[self alloc] init];
        signal->_didSubscribe = [didSubscribe copy];
        return [signal setNameWithFormat:@"+createSignal:"];
    }
    

    这里面把didSubscribe这个block赋值给了信号的_didSubscribe成员变量。后面在信号调用subscribeNext的时候会用到。

    接下来看订阅信号的代码

    //2、订阅信号量
        [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
    

    这里也传递了一个block进去。进入subscribeNext定义里面看看

    - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
        NSCParameterAssert(nextBlock != NULL);
        
        RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
        return [self subscribe:o];
    }
    //上面的代码做了两件事情,1,创建了RACSubscriber对象。调用了信号的subscribe方法,以刚才创建的RACSubscriber对象为参数。
    //首先进入创建RACSubscriber对象的类方法里面看看。就是创建对想和响应的赋值。
    + (instancetype)subscriberWithNext:(void (^)(id x))next error:(void (^)(NSError *error))error completed:(void (^)(void))completed {
        RACSubscriber *subscriber = [[self alloc] init];
    
        subscriber->_next = [next copy];
        subscriber->_error = [error copy];
        subscriber->_completed = [completed copy];
    
        return subscriber;
    }
    

    然后再看subscribe方法的实现,还记得刚才我们创建的是RACDynamicSignal类型的对象吗?所以定义在RACDynamicSignal里面

    - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {
        NSCParameterAssert(subscriber != nil);
    
        RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable];
        subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable];
    
        if (self.didSubscribe != NULL) {
            RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{
                RACDisposable *innerDisposable = self.didSubscribe(subscriber);
                [disposable addDisposable:innerDisposable];
            }];
    
            [disposable addDisposable:schedulingDisposable];
        }
        
        return disposable;
    }
    

    上面的self.didSubscribe(subscriber)是block调用,didSubscribe就是创建信号时候的block;参数subscriber,也就是subscribeNext:方法里面创建的这个RACSubscriber类型的对象。这个对象的_next属性保存了subscribeNext:这个方法的block参数。

    最后看一下发布消息的代码

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

    这里就是调用了存在于next中的block,这个block就是subscribeNext:方法中的block。

    所以这段代码执行之后,调用上面的这个block,输出如下:
    创建信号量
    I'm send next data
    那我啥时候运行

    //后续所有RAC相关的代码都在这个Demo中
    Demo:https://github.com/BigFish2018/MVVM.git

    参考:
    https://www.jianshu.com/p/35a28cf0a22f
    http://www.cocoachina.com/ios/20150123/10994.html

    相关文章

      网友评论

          本文标题:RAC实战1---信号的创建、订阅、发送

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