RAC Day1 信号创建到订阅的过程
2020-10-15 本文已影响0人
帅气的阿斌
一、RAC基础知识及使用
1.继承关系
RAC类继承关系
2.基本使用
- 创建一个基本信号
// ^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber)
// 回调block:返回值为 RACDisposable 类型,传入参数为subscriber(遵循RACSubscriber协议)
//===》原方法声明如下
// + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
// sendCompleted 告诉订阅者该信号此次数据发送完毕(以此来执行下一个订阅的信号)
//创建一个基本的信号
RACSignal *racignl = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"map1"];
[subscriber sendNext:@"map2"];
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{//信号disposable则会被调用
;
}];
}];
//简单的信号订阅以及取消订阅
RACDisposable *disposable = [racignl subscribeNext:^(id _Nullable x) {//信号每被subscribeNext一次 createSignal:后的block都会被执行一次,即值会全部再发送一遍
NSLog(@"%@", x);
}];
[disposable dispose];//取消订阅
做了什么?
RACSignal调用createSignal方法
=>
RACDynamicSignal调用createSignal方法
=>
创建RACDynamicSignal对象,并持有subscriber这个block
- 信号订阅
后面要做什么?(既然持有了这个block,那么这个block什么时候调用呢 ?)
[racignl subscribeNext:^(id _Nullable x) {
;//code
} error:^(NSError * _Nullable error) {
;//code
} completed:^{
;//code
}];
RACSignal调用subscribeNext
=>
RACSubscriber调用subscriberWithNext
=>
创建RACSubscriber对象,并持有传入的所有block
再调用RACDynamicSignal的subscribe方法,传入的参数是创建的RACSubscriber对象
RACDynamicSignal的subscribe方法做了什么
创建RACCompoundDisposable和RACPassthroughSubscriber对象
注:RACPassthroughSubscriber:持有RACSignal,RACSubscriber,RACCompoundDisposable
RACCompoundDisposable:订阅的销毁对象
这两个对象创建完成后
if (self.didSubscribe != NULL) {
RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{
RACDisposable *innerDisposable = self.didSubscribe(subscriber);
[disposable addDisposable:innerDisposable];
}];
[disposable addDisposable:schedulingDisposable];
}
self.didSubscribe(subscriber);则调用了subscriber这个block
[subscriber sendNext:@"map1"];
[subscriber sendNext:@"map2"];
[subscriber sendCompleted];
至此就是信号创建到订阅的大概过程
参考:https://www.jianshu.com/p/d7d951a99db8