大家好,关于深入解析RACSignal的订阅机制:图文详解很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
+ (RACSignal *)createSignal:(RACDisposable * (^)(idsubscriber))didSubscribe {
返回[RACDynamicSignal createSignal:didSubscribe];
}+ (RACSignal *)createSignal:(RACDisposable * (^)(idsubscriber))didSubscribe {
RACDynamicSignal *signal=[[self alloc] init];
signal-_didSubscribe=[didSubscribe 副本];
返回[信号setNameWithFormat:@"+createSignal:"];
}
创建subscriber
信号通过调用subscribeNext 方法生成订阅者,并在订阅者中保存下一个、错误和完成的块。
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
NSCParameterAssert(nextBlock !=NULL);
RACSubscriber *o=[RACSubscriberSubscriberWithNext:nextBlock 错误:NULL 已完成:NULL];
返回[自我订阅:o];
}+ (instancetype)subscriberWithNext:(void (^)(id x))下一个错误:(void (^)(NSError *error))错误完成:(void (^)(void))完成{
RACSubscriber *订阅者=[[self alloc] init];
订阅者-_next=[下一个副本];
订阅者-_error=[错误副本];
订阅者-_completed=[已完成的副本];
返回订户;
}
进行subscribe
第二步,创建订阅者后,调用signal的subscribe方法,并将创建的订阅者作为参数。
此步骤将生成RACCompoundDisposable 和RACPassthroughSubscriber 对象。
RACCompoundDisposable:RACDisposable 的子类,可以添加多个RACDisposable 对象。当RACCompoundDisposable 对象被释放时,容器中的所有RACDisposable 对象都将被释放。 RACPassthroughSubscriber:分别保存对RACSignal、RACSubscriber 和RACCompoundDisposable 的引用。通过RACPassthroughSubscriber对象转发到真正的订阅者。 - (RACDisposable *)subscribe:(id)订阅者{
NSCParameterAssert(订阅者!=nil);
RACCompoundDisposable *一次性=[RACCompoundDisposable 复合一次性];
订阅者=[[RACPassthroughSubscriber alloc] initWithSubscriber:订阅者信号:selfdisposable:disposable];
if (self.didSubscribe !=NULL) {
RACDisposable *schedulingDisposable=[RACScheduler.subscriptionScheduler Schedule:^{
RACDisposable *innerDisposable=self.didSubscribe(订阅者);
[一次性addDisposable:innerDisposable];
}];
[一次性addDisposable:schedulingDisposable];
}
返回一次性物品;
}
执行disSubscribe block
RACSignal 通过RACScheduler.subscriptionScheduler 执行闭包。实际调用disSubscribe的位置是RACDisposable *innerDisposable=self.didSubscribe(subscriber);
- (RACDisposable *)schedule:(void (^)(void))block {
NSCParameterAssert(块!=NULL);
if (RACScheduler.currentScheduler==nil) return [self.backgroundScheduler Schedule:block];
堵塞();
返回零;
调用sendNext sendError sendCompleted
进入didSubscribe闭包后,调用sendNext:sendError:sendCompleted。由于第三步中subscriber被替换为RACPassthroughSubscriber对象,真正的subscriber存储在RACPassthroughSubscriber对象中,即innerSubscriber中,所以这一步中的各种send方法实际上都是一个转发过程。
- (void)sendNext:(id)值{
if (self.disposable.dispose) 返回;
如果(RACSIGNAL_NEXT_ENABLED()){
RACSIGNAL_NEXT(cleanedSignalDescription(self.signal),cleanedDTraceString(self.innerSubscriber.description),cleanedDTraceString([值描述]));
}
[self.innerSubscriber sendNext:value];
}
- (void)sendError:(NSError *)错误{
if (self.disposable.dispose) 返回;
如果(RACSIGNAL_ERROR_ENABLED()){
RACSIGNAL_ERROR(cleanedSignalDescription(self.signal),cleanedDTraceString(self.innerSubscriber.description),cleanedDTraceString(error.description));
}
[self.innerSubscriber sendError:error];
}
- (void)sendCompleted {
if (self.disposable.dispose) 返回;
如果(RACSIGNAL_COMPLETED_ENABLED()){
RACSIGNAL_COMPLETED(cleanedSignalDescription(self.signal),cleanedDTraceString(self.innerSubscriber.description));
}
[self.innerSubscriber 发送完成];
执行next error completed闭包
通过调用innerSubscriber的sendNext:sendError、sendCompleted方法,在真实订阅者中执行下一个错误完成闭包
- (void)sendNext:(id)值{
@同步(自我){
void (^nextBlock)(id)=[self.下一个副本];
if (nextBlock==nil) 返回;
下一个块(值);
}
}
- (void)sendError:(NSError *)e {
@同步(自我){
void (^errorBlock)(NSError *)=[self.error 副本];
[自行处置];
if (errorBlock==nil) 返回;
错误块(e);
}
}
- (void)sendCompleted {
@同步(自我){
void (^completedBlock)(void)=[self.completed 副本];
[自行处置];
if (completedBlock==nil) 返回;
完成块();
文章到此结束,如果本次分享的深入解析RACSignal的订阅机制:图文详解和的问题解决了您的问题,那么我们由衷的感到高兴!
【深入解析RACSignal的订阅机制:图文详解】相关文章:
用户评论
终于不用再看那长长的说明文档了!
有6位网友表示赞同!
哈哈,图片直观易懂!我一下子就明白了。
有7位网友表示赞同!
这个图画得真棒!很清晰地展示了 RACSignal 的 Subscriptions 过程。
有18位网友表示赞同!
原来是这样啊!之前感觉订阅机制超级复杂的,现在看起来还好理解。
有17位网友表示赞同!
学习 iOS 开发必备知识,这篇文章真是太实用点了!
有17位网友表示赞同!
图文并茂,讲解非常到位!谢谢分享!
有14位网友表示赞同!
对初学者来说简直就是福音啊!一下子就明白了 RACSignal 的订阅机制。
有11位网友表示赞同!
这种可视化的方式学习确实很有帮助,理解起来更轻松!
有16位网友表示赞同!
我本来打算找资料专门学习 RACSignal 的,现在有这篇文章就行了!
有7位网友表示赞同!
分享一下,之前我一直搞不懂这些概念,看到图就豁然开朗了。
有8位网友表示赞同!
感谢这位博主,图片讲解清晰易懂,真棒!
有18位网友表示赞同!
我打算保存这篇博客文章啦,以后遇到 RACSignal 的问题可以参考一下。
有19位网友表示赞同!
这种图解方法太优秀了,把复杂的概念解释得简单明了!
有20位网友表示赞同!
iOS 开发好难啊,总是有新东西需要学习,幸好有这样好的资源!
有10位网友表示赞同!
希望以后还能看到更多关于 iOS 开发的图文讲解文章!
有8位网友表示赞同!
这个图片真的很吸引人,一看就很有想法!
有19位网友表示赞同!
学习iOS开发,现在越来越方便了,网上各种教程都很好用。
有12位网友表示赞同!
RACSignal 的订阅机制确实比较重要,感谢作者分享这种清晰的讲解方法!
有16位网友表示赞同!
我已经收藏了这篇文章,等待我下次需要的时候再翻出来看看!
有15位网友表示赞同!