RACDisposable

文章系列
《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  _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)