1、RACDisposable
RACDisposable它是帮助我们取消订阅,信号发送完毕或者失败都需要取消订阅,有点类似于通知,当你发送通知的时候,就得删除通知。
//1.创建信号(冷信号)
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//3.发送信号
[subscriber sendNext:@"我在发送信号"];
return [RACDisposable disposableWithBlock:^{
//只要信号取消订阅就会进入这个block
NSLog(@"取消订阅了");
}];
}];
//2.订阅信号(热信号)
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"订阅信号 %@", x);
}];
在下段代码中我们看到 RACDisposable 有一个类方法 disposableWithBlock,用户取消了订阅就会进入这个block,也就是说一个信号发送数据完毕就会主动取消订阅,如果你用一个属性引用了subscriber那么这个订阅就不会取消,因为只要有订阅者在,就不会自动取消订阅。代码如下
//
// ViewController.m
// RAC的简单使用以及应用场景
//
// Created by JM on 2018/4/19.
// Copyright © 2018年 JM. All rights reserved.
//
#import "ViewController.h"
#import <ReactiveObjC/ReactiveObjC.h>
@interface ViewController ()
/** subscriber */
@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 sendNext:@"我在发送信号"];
//引用subscriber(这个时候下面的block代码块就不会走)
self.subscriber = subscriber;
return [RACDisposable disposableWithBlock:^{
//只要信号取消订阅就会进入这个block
NSLog(@"取消订阅了");
}];
}];
//2.订阅信号(热信号)
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"订阅信号 %@", x);
}];
}
@end
如何手动取消订阅
//
// ViewController.m
// RAC的简单使用以及应用场景
//
// Created by JM on 2018/4/19.
// Copyright © 2018年 JM. All rights reserved.
//
#import "ViewController.h"
#import <ReactiveObjC/ReactiveObjC.h>
@interface ViewController ()
/** subscriber */
@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 sendNext:@"我在发送信号"];
self.subscriber = subscriber;
return [RACDisposable disposableWithBlock:^{
//只要信号取消订阅就会进入这个block
NSLog(@"取消订阅了");
}];
}];
//2.订阅信号(热信号)
RACDisposable *disposable = [signal subscribeNext:^(id _Nullable x) {
NSLog(@"订阅信号 %@", x);
}];
//因为有订阅者在, 所有手动取消订阅
[disposable dispose];
}
@end
2、RACSubscriber
这里简要说明RACSubscriber是一个信号的订阅者,后续会有详细说明。
demo源代码已放置GitHub地址https://github.com/JunAILiang/RAC_Demo
联系我:
qq: 1245424073
微信: liujunmin6980