文章系列
《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 之后, 就'相当于'结束订阅了, 可以理解成订阅者就销毁了
(红色文字部分后续会在信号的生命周期中详细解释.)
- 订阅者被销毁
当运行sendCompleted 或者senfError 之后, 订阅者就被放到自动释放池中, 等待被销毁了, 这里当做已经销毁了, 打印结果如下:订阅者销毁, 就会调用.png
- 订阅者未被销毁
当定义全局变量强引用订阅者subscriber, 就不会调用block:订阅者没有销毁是不会调用block 的
- 主动调用dispose
在RACDisposable 对象调用dispose对象时, 就算强引用, block也会被执行, 执行之后,当前订阅者就取消了订阅:image.png
.End
网友评论