最近在一直在学习RAC框架的Object-C版本ReactiveObjC(Swift版本为ReactiveSwift),这篇文章简单展示一下学习的成果!!!如果有什么地方理解错误,欢迎大家指正!!!互相学习......
ReactiveObjC 这里只是抛砖引玉!!!如果有什么理解不到位的,欢迎批评指正,共同进步!!!
RAC框架中的继承关系(不包含分类)
1129722-20170703211823972-622987082.png
注意:
1、关于底层实现是三方已经自动帮我们实现的过程,我们只需要,学会使用步骤就行了,当然多了解底层原理有助于我们提升自己的能力!!!
2、不同类型信号的订阅,处理的事情不一样。
pragma mark -- RAC/RACSignal
RACSignal使用步骤:
1、创建信号: + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe;
2、订阅信号:- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;
3、发送信号:- (void)sendNext:(id)value;
特点:先订阅,后发送。
RACSignal底层实现:
1、创建信号:把didSubscribe(代码块)保存到信号中
2、订阅信号:调用signal的subscribeNext:(void (^)(id x))nextBlock
3、调用RACDynamicSignal的didSubscribe把订阅者传递过去
4、[subscriber sendNext:@1]; 调用订阅者的发送消息的方法,发送消息
5、执行nextBlock这个代码块
//代码实现
// 1. 创建订阅者
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//3.发送信号 ,发送信号之前一定要先订阅信号
[subscriber sendNext:@"RAC signal"];
return nil;
}];
//2. 订阅信号
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"---%@",x);
}];
//控制台打印: ---RAC signal
图例
1129722-20170629191936321-1388848008.png
pragma mark -- RACSubject
RACSubject使用步骤:
1、创建信号: + (instancetype)subject;
2、订阅信号:- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;
3、发送信号:- (void)sendNext:(id)value;
特点:先订阅,后发送。
RACSubject底层实现
1.调用subscribeNext订阅信号,把订阅者保存起来,并且订阅者的nextBlock中已经赋值了。
2.调用sendNext发送信号,遍历刚刚保存的所有订阅者,分别调用订阅者的nextBlock。
//代码实现
//1. 创建信号
RACSubject *subject = [RACSubject subject];
//2. 订阅信号
[subject subscribeNext:^(id _Nullable x) {
//block 调用时刻 : 当信号发出新值 ,就会调用
NSLog(@"第一个订阅者 %@",x);
}];
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"第二个订阅者 %@",x);
}];
//3.发送信号
[subject sendNext:@"RACSubject"];
//控制台打印: 第一个订阅者 RACSubject
第二个订阅者 RACSubject
图例
1129722-20170629225320243-164179572.png
pragma mark -- RACReplaySubject
RACReplaySubject使用步骤:
1、创建信号: + (instancetype)subject;
2/3、订阅信号:- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;
3/2、发送信号:- (void)sendNext:(id)value;
特点:可以先订阅信号,也可以先发送信号
RACReplaySubject底层实现
1.调用sendNext发送信号,把需要发送的信号保存起来,然后遍历刚刚保存的所有订阅者,一个一个调用订阅者的nextBlock。
2.调用subscribeNext订阅信号,遍历保存的所有值,一个一个调用订阅者的nextBlock
如果想要当一个信号被订阅,就重复播放之前所有值,需要先发送信号,在订阅信号。(也就是先保存值,再订阅值。)
每一个订阅者接收全部信号(信号已经全部保存完毕)
//代码实现(先发送 ,后订阅)
// 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);
}];
//控制台打印:(先发送后订阅)
第一个订阅者接收到的数据1
第一个订阅者接收到的数据2
第二个订阅者接收到的数据1
第二个订阅者接收到的数据2
图例:(先发送后订阅)
1129722-20170703200338315-1560237486.png
//代码实现(先订阅,后发送 )
// 1.创建信号
RACReplaySubject *replaySubject = [RACReplaySubject subject];
// 2.订阅信号
[replaySubject subscribeNext:^(id x) {
NSLog(@"第一个订阅者接收到的数据%@",x);
}];
// 订阅信号
[replaySubject subscribeNext:^(id x) {
NSLog(@"第二个订阅者接收到的数据%@",x);
}];
// 3.发送信号
[replaySubject sendNext:@1];
[replaySubject sendNext:@2];
//控制台打印:(先订阅后发送)
第一个订阅者接收到的数据1
第二个订阅者接收到的数据1
第一个订阅者接收到的数据2
第二个订阅者接收到的数据2
图例:(先订阅后发送)
1129722-20170703201414019-812141403.png
网友评论