美文网首页
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---信号的创建、订阅、发送

    我们先从创建一个信号开始说起吧 进入createSignal看看 这里面把didSubscribe这个block赋...

  • RAC学习之二

    RACSignal(信号)介绍: 核心思想:创建信号、订阅信号、发送信号 1、创建信号及发送信号 类方法创建RAC...

  • 01-ReactiveObjC使用记录

    RAC 的核心思想:创建信号 - 订阅信号 - 发送信号 ,并且在 RAC 中我们会看到大量的 block RAC...

  • iOS-RAC综述

    上一篇我们探索了RAC的核心流程就是: 创建信号 订阅信号 订阅者发送信号 销毁 那么我们根据这些操作来看看RAC...

  • RAC基本用法

    1.信号的创建、订阅和发送 1.1创建信号 1.2 订阅信号 1.3 合并到一块的写法 2.RAC信号的监听 2....

  • rac 事件概述及处理

    概述:想要知道rac就必须知道rac中的三个要点 创建信号、发送信号、订阅信号。 reactive事件 reac...

  • ReactiveCocoa深入理解

    信号signal是RAC的绝对核心,所有的操作都是围绕着信号来处理的。比如:创建信号,订阅信号,发送信号是消息发送...

  • 史上最全ReactiveCocoa(RAC)之信号类源码解析

    信号signal是RAC的绝对核心,所有的操作都是围绕着信号来处理的。比如:创建信号,订阅信号,发送信号是消息发送...

  • RAC使用

    RAC使用 不介绍RAC是啥了,直接上干货 基础用法 创建信号及发送内容 订阅信号 如果只关注单个或者部分,也可以...

  • RAC简单示例

    RAC简单示例 信号订阅与发送 使用示例

网友评论

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

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