首页 > 科技 >

Pull-Driven 的数据流 RACSequence(4)

2018-08-21 03:58:15 网络整理 阅读:92 评论:0

在使用 RACDynamicSequence 中的元素时,无论是 head 还是 tail 都会用到在初始化方法中传入的三个 block:- (id)head { @synchronized (self) { id untypedHeadBlock = self.headBlock; if (untypedHeadBlock == nil) return _head; if (self.hasDependency) { if (self.dependencyBlock != nil) { _dependency = self.dependencyBlock(); self.dependencyBlock = nil; } id (^headBlock)(id) = untypedHeadBlock; _head = headBlock(_dependency); } else { id (^headBlock)(void) = untypedHeadBlock; _head = headBlock(); } self.headBlock = nil; return _head; }}

head 的计算依赖于 self.headBlock 和 self.dependencyBlock;

而 tail 的计算也依赖于 self.headBlock 和 self.dependencyBlock,只是 tail 会执行 tailBlock 返回另一个 RACDynamicSequence 的实例:^ id (id _) { return [valuesSeq bind:bindBlock passingThroughValuesFromSequence:current.tail];}

这里通过一段代码更好的了解 -bind: 方法是如何使用的:RACSequence *sequence = [RACSequence sequenceWithHeadBlock:^id _Nullable{ return @1;} tailBlock:^RACSequence * _Nonnull{ return [RACSequence sequenceWithHeadBlock:^id _Nullable{ return @2; } tailBlock:^RACSequence * _Nonnull{ return [RACSequence return:@3]; }];}];RACSequence *bindSequence = [sequence bind:^RACSequenceBindBlock _Nonnull{ return ^(NSNumber *value, BOOL *stop) { NSLog(@"RACSequenceBindBlock: %@", value); value = @(value.integerValue * 2); return [RACSequence return:value]; };}];NSLog(@"sequence: head = (%@), tail=(%@)", sequence.head, sequence.tail);NSLog(@"BindSequence: head = (%@), tail=(%@)", bindSequence.head, bindSequence.tail);

相关文章