美文网首页
iOS: RAC篇 - RACDisposable

iOS: RAC篇 - RACDisposable

作者: 一欧Yiou | 来源:发表于2018-06-25 13:34 被阅读30次

还记得创建创建RACSignal的时候返回的那个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: %@",x); 
}];

这里干了啥??? 不知道就进去瞅瞅呗~~

+ (instancetype)disposableWithBlock:(void (^)(void))block {
    return [[self alloc] initWithBlock:block];
}
这里代码就简单了,
创建这个对象的时候顺便把这个block保存了.
然后在创建RACDisposable对象劈头盖脸的就是一个block,但是这个block啥时候调用呢?
1 订阅者被销毁
2 RACDisposable 调用dispose取消订阅
然后我们就试验证明情况
1 订阅者被销毁

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

//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: %@",x); 
}];

这里我们创建了一个subscriber对象,
并且在发送数据之后就赋值了,从而达到不让subscriber被销毁
运行结果:
创建信号量
I'm send next data
发送信号???~~~

有此可见

订阅者销毁会调用RACDisposableblock



然后我们接着证明第二点,就算在强引用订阅者的情况下,主动调用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]; 这个方法
运行结果:
创建信号量
I'm send next data
发送信号???~~~
发送 disposable

相关文章

网友评论

      本文标题:iOS: RAC篇 - RACDisposable

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