iOS RAC - RACDisposable

作者: Codepgq | 来源:发表于2017-07-13 16:37 被阅读861次

    文章系列
    《RACSignal 》
    《RACDisposable》
    《RACSubject、RACReplaySubject》
    《iOS RAC - 基本用法》
    《iOS RAC - 定时器》
    《iOS RAC - RACMulticastConnection》
    《iOS RAC - RACCommand》
    《iOS RAC - 核心方法bind》
    《iOS RAC - 集合RACTuple、RACSequence》
    《iOS RAC - rac_leftSelector》
    《iOS RAC - 映射》
    《iOS RAC - 过滤》
    《iOS RAC - 登录页面,MVVM》

    还记得创建RACSignal的时候返回的那个nil嘛?这里我们就来看看RACDisposable这个类。

    上次我们选择直接返回nil,这次我们返回一个RACDisposable对象

     //1、创建信号量
        RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            
            NSLog(@"创建信号量");
            
            //3、发布信息
            [subscriber sendNext:@"I'm send next data"];
            
            NSLog(@"那我啥时候运行");
            
            return [RACDisposable disposableWithBlock:^{
                NSLog(@"disposable");
            }];
        }];
        
        //2、订阅信号量
        [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
    

    <br />
    按照惯例我们先看下内部做了什么,点进去看看

    + (instancetype)disposableWithBlock:(void (^)(void))block {
        return [[self alloc] initWithBlock:block];
    }
    这里代码就简单了,创建这个对象的时候保存block
    

    <br />

    然后在创建RACDisposable对象劈头盖脸的就是一个block,但是这个block啥时候调用呢?
    • 1 订阅者被销毁
    • 2 RACDisposable 调用dispose取消订阅

    <br />

    然后我们就试验证明情况
    1 订阅者被销毁

    在运行上面的代码之后RACDisposable的block也如期而至的调用了,然后我么仔细观察一下代码,
    发生订阅者没有强引用,所以会调用RACDisposable的block,
    现在我们把订阅者强引用,不让他销毁,看会发生什么。

     //1、创建信号量
        RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            
            NSLog(@"创建信号量");
            
            //3、发布信息
            [subscriber sendNext:@"I'm send next data"];
            
            self.subscriber = subscriber;
            
            NSLog(@"那我啥时候运行");
            
            return [RACDisposable disposableWithBlock:^{
                NSLog(@"disposable");
            }];
        }];
        
        //2、订阅信号量
        [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
    这里我们创建了一个subscriber对象,
    并且在发送数据之后就赋值了,从而达到不让subscriber被销毁
    

    运行结果如下:

    订阅者销毁才会调用

    由此可以得知

    • 订阅者销毁会调用RACDisposable的block

    <br />
    然后我们接着证明第二点,就算在强引用订阅者的情况下,主动调用dispose也会调用block

     //1、创建信号量
        RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            
            NSLog(@"创建信号量");
            
            //3、发布信息
            [subscriber sendNext:@"I'm send next data"];
            
            self.subscriber = subscriber;
            
            NSLog(@"那我啥时候运行");
            
            return [RACDisposable disposableWithBlock:^{
                NSLog(@"disposable");
            }];
        }];
        
        //2、订阅信号量
        RACDisposable *disposable = [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
        
        //主动触发取消订阅
        [disposable dispose];
    
    在发送订阅的时候会给我们一个RACDisposable对象,
    我们拿到它,然后调用 [disposable dispose]; 这个方法
    

    其运行结果如下:

    dispose

    相关文章

      网友评论

        本文标题:iOS RAC - RACDisposable

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