美文网首页
RAC框架源码解析之RACSignal

RAC框架源码解析之RACSignal

作者: Jimi | 来源:发表于2018-04-19 01:38 被阅读24次

1、RACSignal

RacSignal是一个信号类!有如下几个特点:

  1. 通过RACSignal创建出来的信号默认就是冷信号,意思就是没有订阅者
  2. 通过订阅者订阅信号(从冷信号变成了热信号),有点类似OC里面的通知
  3. 发送信号

如何使用

    //1.创建信号(冷信号)
    RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        //3.发送信号
        [subscriber sendNext:@"我在发送信号"];
        
        return nil;
    }];
    
    //2.订阅信号(热信号)
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"订阅信号 %@", x);
    }];

控制台输出打印

2018-04-19 00:54:49.494659+0800 RAC的简单使用以及应用场景[10016:421580] 订阅信号 我在发送信号

2、RACSignal调用原理

首先我们知道 RACSignal 在创建信号的时候有一个block,那么这个block在什么时候被调用的呢! 其实用 RACSignal 创建的信号当冷信号变为热信号时就会调用,也就是说只要订阅了这个信号就会走进该blcok。
我们点进去创建信号 createSignal 方法, 看到了一个didSubscribe的参数,那么这个didSubscribe这个参数是用来做什么的呢!

两个作用:
1、只要一个信号被订阅就会调用
2、利用subscriber发送数据

在下段代码块中我们看到了这里创建一个信号,并且返回的是 RACDynamicSignal 并且把你传进来的 didSubscribe 原封不动的给了 RACDynamicSignal

+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
    return [RACDynamicSignal createSignal:didSubscribe];
}

再点击进入 createSignal 方法,看看他到底拿了我的 didSubscribe 做了什么事情?

1、创建一个消息对象 RACDynamicSignal *signal = [[self alloc] init];
2、对你的block进行copy signal->_didSubscribe = [didSubscribe copy];
3、返回信号,注意这是时候传进来的 didSubscribe 保存在了我们的代码里,但是还并没有被调用

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

现在我们来看看订阅信号 subscribeNext 这个方法是用来做什么的呢!其实只要订阅者发送数据就会调用,我们点进订阅信号 subscribeNext 的方法,看到了一个 nextBlock 的参数,那么这个 nextBlock 参数是用来做什么的呢!

两个作用:
1、只要订阅者发送数据就会调用
2、处理数据

在下段代码中的 nextBlock 其实就是在订阅信号时的参数,也就是说相当外界的 x参数 也就是block ,当它拿到这个block的时候先创建一个订阅者 RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL]; ,在调用 return [self subscribe:o]; 才是真正的创建了一个订阅者。

- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
    NSCParameterAssert(nextBlock != NULL);
    
    RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
    return [self subscribe:o];
}

我们先来看看 subscriberWithNext: error: completed: 这个方法到底干了什么事

1、原来在这个方法中它只是创建一个订阅者
2、返回订阅者

+ (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;
}

我们再来看看 return [self subscribe:o]; 这个方法又做了什么事?
它首先判断didSubscribe是否为空,也就是创建信号的block,如果有值就执行,就把你保存的block进行调用,

#pragma mark Managing Subscribers

- (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;
}

demo源代码已放置GitHub地址https://github.com/JunAILiang/RAC_Demo

联系我:
qq: 1245424073
微信: liujunmin6980

相关文章

  • RAC框架源码解析之RACSignal

    1、RACSignal RacSignal是一个信号类!有如下几个特点: 通过RACSignal创建出来的信号默认...

  • RAC源码解析

    RAC是一个函数响应编程框架。 先来一个简单的RAC使用: RACSignal使用步骤:1.创建信号 + (RAC...

  • RAC框架源码解析之RACReplaySubject

    1、RACReplaySubject 前面的文章我们说到RACSubject既可以 创建信号 又可以 订阅信号 ...

  • RAC框架源码解析之NSTimer

    1、RunLoop基础知识 首先我们先简单的来说一下,我们都知道程序启动的时候去走进main函数,在main用Ap...

  • RAC框架源码解析之RACSubject

    1、RACSubject RACSubject 这个类是一个信号提供者!他可以充当信号,又能够发送信号,前面我们用...

  • RAC框架源码解析之RACDisposable

    1、RACDisposable RACDisposable它是帮助我们取消订阅,信号发送完毕或者失败都需要取消订阅...

  • RAC框架源码解析之RAC集合类

    1、RACTuple RACTuple是一个元祖,也是一个集合,操作的方式和NSArray差不多,我们可以简单的看...

  • RAC 详细解析

    RAC详细解析(一)—— 框架概览RAC详细解析(二)—— 基础使用方法

  • ReactiveObjC (一)

    RAC 看似使用简单,代码紧凑,但不太容易精通,这里做一个简单汇总。 RAC 框架中的主要类 RACSignal ...

  • ReactiveCocoa

    一、RAC的基本概念信号RACSignal: 信号是RAC中最核心的概念,贯穿在整个RAC框架中。它其实是一个信号...

网友评论

      本文标题:RAC框架源码解析之RACSignal

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