简单介绍
一个很出名的函数响应编程开源框架,可以帮助我们更简单快捷的处理事件
RAC中最常见的类
- RACSignal 信号类
- RACDisposable 它可以帮助我们取消订阅
- RACSubscriber 订阅者
- RACSubject 信号提供者
RAC 信号订阅发送的两种方式
- RACSignal 冷信号到热信号的转换
- RACSubject 能充当信号,又能发送信号
RACSignal 冷热信号转换的源码跟踪
先贴一段示例代码:
//1️⃣ RACSignal的创建
RACSignal *singal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 7️⃣
[subscriber sendNext:@"123"];
[subscriber sendNext:@"245"];
return [RACDisposable disposableWithBlock:^{
//信号取消订阅就会来这里,如有必要需要情况资源
}];
}];
//3️⃣ RACSignal的订阅
RACDisposable *disponsable = [singal subscribeNext:^(id _Nullable x) {
NSLog(@"收到:%@",x);
}];
接下来根据我画的示例流程图来跟下源码
先进入[RACSignal createSignal] --> [RACDynamicSignal createSignal]
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
//创建一个RACDynamicSignal对象
RACDynamicSignal *signal = [[self alloc] init];
//2️⃣ 把我们传入的block赋值给_didSubscribe变量
signal->_didSubscribe = [didSubscribe copy];
//返回
return [signal setNameWithFormat:@"+createSignal:"];
}
进入[RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
+ (instancetype)subscriberWithNext:(void (^)(id x))next error:(void (^)(NSError *error))error completed:(void (^)(void))completed {
//4️⃣ 创建订阅者
RACSubscriber *subscriber = [[self alloc] init];
//5️⃣ 保存nextBlock
subscriber->_next = [next copy];
subscriber->_error = [error copy];
subscriber->_completed = [completed copy];
return subscriber;
}
进入[self subscribe:o]
- (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {
NSCParameterAssert(subscriber != nil);
RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable];
subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable];
if (self.didSubscribe != NULL) {
RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{
//6️⃣ 执行RACSingal一开始保存的_didSubscribe,这一刻里面的信号就变成热信号
RACDisposable *innerDisposable = self.didSubscribe(subscriber);
[disposable addDisposable:innerDisposable];
}];
[disposable addDisposable:schedulingDisposable];
}
return disposable;
}
进入[subscriber sendNext:]
- (void)sendNext:(id)value {
@synchronized (self) {
void (^nextBlock)(id) = [self.next copy];
if (nextBlock == nil) return;
// 8️⃣
nextBlock(value);
}
}
ps:请跟着流程图对源码进行阅读,关键点本人已加上注释。本人能力有限,有什么错误或者表达不清的还望指正。