RAC_1.RACSignal(信号类)
2018-04-04 本文已影响34人
Iris_Fighting
1.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:nextBlock
2.1 subscribeNext内部会调用siganl的didSubscribe
2.2 subscribeNext内部会创建订阅者subscriber,并且把nextBlock保存到subscriber中。
3.siganl的didSubscribe中调用[subscriber sendNext:@1];
3.1 sendNext底层其实就是执行subscriber的nextBlock
示例代码:
// RACSignal: 信号类,当我们有数据产生,创建一个信号!
//1.创建信号(冷信号!)
//didSubscribe调用:只要一个信号被订阅就会调用!!
//didSubscribe作用:利用subscriber发送数据!!
RACSignal * signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//3.发送数据subscriber它来发送
[subscriber sendNext:@"我想静静"];
return nil;
}];
//2.订阅信号(热信号!!)
//nextBlock调用:只要订阅者发送数据就会调用!
//nextBlock作用:处理数据,展示UI界面!
[signal subscribeNext:^(id x) {
//x:信号发送的内容!!
NSLog(@"%@",x);
}];
1.2.RACDisposable——用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。
示例代码:
// RACSignal: 信号类,当我们有数据产生,创建一个信号!
//1.创建信号(冷信号!)
//didSubscribe调用:只要一个信号被订阅就会调用!!
//didSubscribe作用:利用subscriber发送数据!!
RACSignal * signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//3.发送数据subscriber它来发送
[subscriber sendNext:@"我想静静"];
// 如果不在发送数据,最好发送信号完成,内部会自动调用[RACDisposable disposable]取消订阅信号。
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
// block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。
// 执行完Block后,当前信号就不在被订阅了。
NSLog(@"信号被销毁");
}];
}];
//2.订阅信号(热信号!!)
//nextBlock调用:只要订阅者发送数据就会调用!
//nextBlock作用:处理数据,展示UI界面!
RACDisposable * disposable = [signal subscribeNext:^(id x) {
//x:信号发送的内容!!
NSLog(@"信号发送的内容%@",x);
}];
//默认一个信号发送数据完毕就会主动取消订阅
//只要订阅者在,就不会自动取消订阅
//手动取消订阅
[disposable dispose];
如图:
image
1.3.RACSubscriber——订阅者
- 表示订阅者的意思,用于发送信号,这是一个协议,不是一个类,只要遵守这个协议,并且实现方法才能成为订阅者。通过create创建的信号,都有一个订阅者,帮助他发送数据。