文章系列
《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]; 这个方法
其运行结果如下: