RAC快速入门

RAC Day1 信号创建到订阅的过程

2020-10-15  本文已影响0人  帅气的阿斌

一、RAC基础知识及使用

1.继承关系


RAC类继承关系

2.基本使用

//    ^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber)
//    回调block:返回值为 RACDisposable 类型,传入参数为subscriber(遵循RACSubscriber协议)
//===》原方法声明如下
//    + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
//    sendCompleted 告诉订阅者该信号此次数据发送完毕(以此来执行下一个订阅的信号)

    //创建一个基本的信号
    RACSignal *racignl = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        
        [subscriber sendNext:@"map1"];
        [subscriber sendNext:@"map2"];
        [subscriber sendCompleted];
        
        return [RACDisposable disposableWithBlock:^{//信号disposable则会被调用
            ;
        }];
    }];

    //简单的信号订阅以及取消订阅
    RACDisposable *disposable = [racignl subscribeNext:^(id  _Nullable x) {//信号每被subscribeNext一次 createSignal:后的block都会被执行一次,即值会全部再发送一遍
        NSLog(@"%@", x);
    }];
    [disposable dispose];//取消订阅

做了什么?
RACSignal调用createSignal方法
=>
RACDynamicSignal调用createSignal方法
=>
创建RACDynamicSignal对象,并持有subscriber这个block

    [racignl subscribeNext:^(id  _Nullable x) {
        ;//code
    } error:^(NSError * _Nullable error) {
        ;//code
    } completed:^{
        ;//code
    }];

RACSignal调用subscribeNext
=>
RACSubscriber调用subscriberWithNext
=>
创建RACSubscriber对象,并持有传入的所有block
再调用RACDynamicSignalsubscribe方法,传入的参数是创建的RACSubscriber对象
RACDynamicSignalsubscribe方法做了什么
创建RACCompoundDisposableRACPassthroughSubscriber对象
注:RACPassthroughSubscriber:持有RACSignalRACSubscriberRACCompoundDisposable
RACCompoundDisposable:订阅的销毁对象
这两个对象创建完成后

    if (self.didSubscribe != NULL) {
        RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{
            RACDisposable *innerDisposable = self.didSubscribe(subscriber);
            [disposable addDisposable:innerDisposable];
        }];

        [disposable addDisposable:schedulingDisposable];
    }

self.didSubscribe(subscriber);则调用了subscriber这个block

        [subscriber sendNext:@"map1"];
        [subscriber sendNext:@"map2"];
        [subscriber sendCompleted];

至此就是信号创建到订阅的大概过程
参考:https://www.jianshu.com/p/d7d951a99db8

上一篇 下一篇

猜你喜欢

热点阅读