RACDisposable

作者: 下班不写程序 | 来源:发表于2020-10-09 17:18 被阅读0次

    文章系列
    《ReactiveCocoa 概述》
    《RACSignal》
    《RACDisposable》
    《RACSubject、RACReplaySubject(内附冷信号和热信号的区别)》
    《集合RACTuple、RACSequence》
    《RAC 中的通知、代理、KVO, 基本事件、方法的监听》
    《rac_liftSelector》
    《RACMulticastConnection》
    《RACCommand》
    《RAC - 核心方法bind》
    《RAC - 定时器》
    《RACScheduler》
    《RAC - 点击获取验证码 demo》
    《RAC - 映射(Map & flattenMap)》
    《RAC信号操作解释合集》
    《RAC - 信号的生命周期》

    创建信号的过程中, 需要一个传递一个返回值为RACDisposable 的block, 这里就来看看RACDisposable这个类.

    主要用于
    RACSignal : 断开订阅链接
    RACScheduler : 任务的取消

    • 创建信号, return disposable对象
    - (void)RACDisposableTest {
        
        RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
           
            [subscriber sendNext:@10];
            [subscriber sendCompleted];
            
            /*
             - 内部的 disposable, 可以有多个.
             - 外部的 disposable 调用dispose 时, 内部所有的disposable 都调用dispose
             - disposable 中的block 的作用: 集中销毁信号中的多个disposable 对象
             */
            RACDisposable *disposable = [RACDisposable disposableWithBlock:^{
                NSLog(@"RACDisposable");
            }];
            return disposable;
        }];
        
        [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"x = %@", x);
        }];
    }
    

    ↓disposableWithBlock: 的内部实现↓

    + (instancetype)disposableWithBlock:(void (^)(void))block {
        // 保存外面传递进来的block
        return [(RACDisposable *)[self alloc] initWithBlock:block];
    }
    

    对于保存的这个block 的调用时机, 有两点总结:

    • 当订阅者被销毁时, 会调用该block
    • 当RACDisposable 对象调用dispose取消订阅时, 会调用该block
    验证

    当订阅者发送了sendCompleted 或senfError 就'相当于'结束订阅了, 可以理解成订阅者就销毁了
    当订阅者没有被全局变量所引用时, sendNext 之后, 就'相当于'结束订阅了, 可以理解成订阅者就销毁了
    (红色文字部分后续会在信号的生命周期中详细解释.)

    1. 订阅者被销毁
    当运行sendCompleted 或者senfError 之后, 订阅者就被放到自动释放池中, 等待被销毁了, 这里当做已经销毁了, 打印结果如下: 订阅者销毁, 就会调用.png
    1. 订阅者未被销毁
    当定义全局变量强引用订阅者subscriber, 就不会调用block: 订阅者没有销毁是不会调用block 的
    1. 主动调用dispose
    在RACDisposable 对象调用dispose对象时, 就算强引用, block也会被执行, 执行之后,当前订阅者就取消了订阅: image.png

    .End

    相关文章

      网友评论

        本文标题:RACDisposable

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