RACSubject使用步骤
- 1.创建信号 [RACSubject subject],跟RACSiganl不一样,创建信号时没有block。
- 2.订阅信号 - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
- 3.发送信号 sendNext:(id)value
RACSubject:底层实现和RACSignal不一样。
- 1.调用subscribeNext订阅信号,只是把订阅者保存起来,并且订阅者的nextBlock已经赋值了。
- 2.调用sendNext发送信号,遍历刚刚保存的所有订阅者,一个一个调用订阅者的nextBlock。
- 不同信号订阅的方式不一样
- RACSubject处理订阅:仅仅是保存订阅者
RACReplaySubject使用步骤:
- 1.创建信号 [RACSubject subject],跟RACSiganl不一样,创建信号时没有block。
- 2.可以先订阅信号,也可以先发送信号。
- 2.1 订阅信号 - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
- 2.2 发送信号 sendNext:(id)value
RACReplaySubject:底层实现和RACSubject不一样。
1.调用sendNext发送信号,把值保存起来,然后遍历刚刚保存的所有订阅者,一个一个调用订阅者的nextBlock。
-
2.调用subscribeNext订阅信号,遍历保存的所有值,一个一个调用订阅者的nextBlock
- 如果想当一个信号被订阅,就重复播放之前所有值,需要先发送信号,在订阅信号。
- 也就是先保存值,在订阅值。
- (void)viewDidLoad {
[super viewDidLoad];
// 订阅信号
[_redView.btnClickSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}
- (void)RACReplaySubject
{
// 1.创建信号
RACReplaySubject *replaySubject = [RACReplaySubject subject];
// 2.发送信号
[replaySubject sendNext:@1];
[replaySubject sendNext:@2];
// 3.订阅信号
[replaySubject subscribeNext:^(id x) {
NSLog(@"第一个订阅者接收到的数据%@",x);
}];
// 订阅信号
[replaySubject subscribeNext:^(id x) {
NSLog(@"第二个订阅者接收到的数据%@",x);
}];
}
- (void)RACSubject
{
// 1.创建信号
RACSubject *subject = [RACSubject subject];
// 2.订阅信号
[subject subscribeNext:^(id x) {
// block调用时刻:当信号发出新值,就会调用.
NSLog(@"第一个订阅者%@",x);
}];
[subject subscribeNext:^(id x) {
// block调用时刻:当信号发出新值,就会调用.
NSLog(@"第二个订阅者%@",x);
}];
// 3.发送信号
[subject sendNext:@"1"];
// 保存订阅者
// 底层实现:遍历所有的订阅者,调用nextBlock
// 执行流程:
// RACSubject被订阅,仅仅是保存订阅者
// RACSubject发送数据,遍历所有的订阅,调用他们的nextBlock
}