ReactiveCocoa常见类-RACSiganl-信号
2016-08-14 本文已影响15人
solozyx
ViewController.m
#import "ViewController.h"
#import "ReactiveCocoa.h"
@interface ViewController ()
@property (nonatomic, strong) id subscriber; //订阅者
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 核心:信号类
// 信号类作用:只要有数据改变,就会把数据包装成一个信号,传递出去。
// 只要有数据改变,就会有信号发出。
// 数据发出,并不是信号类发出。
// 1.创建信号 createSignal:didSubscribe(block)
// RACDisposable:取消订阅
// RACSubscriber:发送数据
// createSignal方法:
// 1.创建RACDynamicSignal // 动态
// 2.把didSubscribe保存到RACDynamicSignal
RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// block调用时刻:当信号被订阅的时候就会调用
// block作用:描述当前信号哪些数据需要发送
// _subscriber = subscriber;
// 发送数据
NSLog(@"调用了didSubscribe");
// 通常:传递数据出去
[subscriber sendNext:@1];
// 调用订阅者的nextBlock
// 如果信号,想要被取消,就必须返回一个RACDisposable
return [RACDisposable disposableWithBlock:^{
// 信号什么时候被取消:1.自动取消,当一个信号的订阅者被销毁的时候,就会自动取消订阅 2.主动取消
// block调用时刻:一旦一个信号,被取消订阅的时候就会调用
// block作用:当信号取消订阅,用于清空一些资源
NSLog(@"取消订阅");
}];
}];
// subscribeNext:
// 1.创建订阅者
// 2.把nextBlock保存到订阅者里面
// 订阅信号
// 只要订阅信号,就会返回一个取消订阅信号的类
RACDisposable *disposable = [siganl subscribeNext:^(id x) {
// block:只要信号内部发送数据,就会调用这个block
NSLog(@"%@",x);
}];
// 取消订阅
// [disposable dispose];
// RACSignal使用步骤:
// 1.创建信号
// 2.订阅信号
// RACSignal底层实现:
// 1.当一个信号被订阅,创建订阅者,并且把nextBlock保存到订阅者里面
// 2.[RACDynamicSignal subscribe:RACSubscriber]
// 3.调用RACDynamicSignal的didSubscribe
// 4.[subscriber sendNext:@1];
// 5.拿到订阅者的nextBlock调用
}
@end
//2016-08-14 22:08:18.056 ReactiveCocoa[35989:1720465] 调用了didSubscribe
//2016-08-14 22:08:18.057 ReactiveCocoa[35989:1720465] 1
//2016-08-14 22:08:18.057 ReactiveCocoa[35989:1720465] 取消订阅