通过cocopods
导入ReactiveCocoa
到工程中
1. RACSignal 和 RACDisposable
#import "ViewController.h"
#import "ReactiveCocoa.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// RACSignal: 有数据产生的时候, 就使用RACSignal
// RACSignal使用步骤: 1.创建信号 2.订阅信号 3.发送信号
// 1.创建信号(冷信号)
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 这个block->didSubscribe调用: 只要一个信号被订阅就会调用
// 这个block->didSubscribe作用: 发送数据
NSLog(@"信号被订阅了");
// 3. 发送信号 (订阅者发送消息)
[subscriber sendNext:@"这是订阅者发送的信息"];
return [RACDisposable disposableWithBlock:^{
// 只要信号取消订阅就会来到这里 (默认一个信号发送完毕就会自动取消订阅) -> 只要订阅者在, 这个信号就不会被自动取消
// 一般用于清空资源
NSLog(@"信号被取消订阅了");
}];
}];
// 2.订阅信号(热信号)
[signal subscribeNext:^(id x) {
// 这个block->nextBlock调用: 只要订阅者发送数据就会调用
// 这个block->nextBlock作用: 处理数据, 展示到UI上面
// x: 信号发送的内容
NSLog(@"%@", x);
}];
}
/**
* 只要订阅者调用sendNext, 就会执行nextBlock
* 只要RACDynamicSignal信号被订阅, 就会执行didSubscribe
* 前提条件是RACDynamicSignal, 不同类型的订阅,处理订阅的事情不一样
*/
- 默认一个信号发送完毕就会自动取消订阅(
只要订阅者在, 这个信号就不会被自动取消
), 如果我们不想让它自动取消订阅, 我们可以用一个强引用的属性来记录这个订阅者
, 这样就不会进自动取消订阅的block中了 - 如果我们想手动取消订阅, 则订阅信号的方法
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
会返回一个RACDisposable
对象, 我们可以调用这个对象的[disposabel dispose]
方法来手动取消订阅
手动取消订阅
@interface ViewController ()
@property (nonatomic, strong) id<RACSubscriber> subscriber;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 1.创建信号(冷信号)
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 强引用订阅者, 不自动取消订阅
_subscriber = subscriber;
NSLog(@"信号被订阅了");
// 3. 发送信号 (订阅者发送消息)
[subscriber sendNext:@"这是订阅者发送的信息"];
return [RACDisposable disposableWithBlock:^{
NSLog(@"信号被取消订阅了");
}];
}];
// 2.订阅信号(热信号)
RACDisposable *disposabel = [signal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 手动取消订阅
[disposabel dispose];
}