RACDisposable
RACDisposable:它可以帮助我们取消订阅.
比如:信号发送完毕了 、或者信号发送失败了的时候都需要手动去取消订阅。
RACSubscriber(协议):订阅者(发送信号!)
看代码
#import "ViewController.h"
#import <ReactiveObjC/ReactiveObjC.h>
@interface ViewController ()
/** id<RACSubscriber> */
@property (nonatomic,strong) id<RACSubscriber> subscriber;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1、创建一个信号
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//3、发送信号
//subscriber 发送
[subscriber sendNext:@"发送信号"];
_subscriber = subscriber;//可以用self.,强引用一下subscriber就不会走下边了,不强引用着subscriber 的话subscriber在发送完之后就没了就 自动取消订阅了
//返回值的类型RACDisposable
//RACDisposable可以帮助我们取消订阅:信号发送完毕或者失败了。(就像通知的注册和注销)
return [RACDisposable disposableWithBlock:^{
//清空资源
NSLog(@"到这了");
}];
}];
//2、订阅信号
RACDisposable *disposable = [signal subscribeNext:^(id _Nullable x) {
//x就是信号发送的内容
NSLog(@"订阅的信号是: %@",x);
}];
[disposable dispose];//手动 取消订阅
//信号发送完毕了 默认就会取消订阅
//只要订阅者在就不会主动取消订阅 如上边强引用着 subscriber 此时可以手动取消订阅
}
原理
subscriber 在信号发送完毕的时候会主动消失,
此时如果你再强引用一下它的话,
subscriber就不会消失,相当于信号没有发送完,就不会主动取消订阅了。
[signal subscribeNext:^(id _Nullable x) 这个方法放入返回值`RACDisposable`类型的 这个类的对象可以帮助我们实现手动取消订阅:
RACDisposable *disposable = [signal subscribeNext:^(id _Nullable x) {
//x就是信号发送的内容
NSLog(@"订阅的信号是: %@",x);
}];
[disposable dispose];//手动 取消订阅