在上面的代码中,我们使用 +sequenceWithHeadBlock:tailBlock: 这个唯一暴露出来的初始化方法创建了一个如下图所示的 RACSequence:
图中展示了完整的 RACSequence 对象的值,其中的内容暂时都是 unresolved 的。
上述代码在运行之后,会打印出如下内容:sequence: head = (1), tail=(<RACDynamicSequence: 0x60800009eb40>{ name = , head = (unresolved), tail = (unresolved) })RACSequenceBindBlock: 1BindSequence: head = (2), tail=(<RACDynamicSequence: 0x608000282940>{ name = , head = (unresolved), tail = (unresolved) })
无论是 sequence 还是 bindSequence,其中的 tail 部分都是一个 RACDynamicSequence 对象,并且其中的 head 和 tail 部分都是 unresolved。
在上面的代码中 RACSequenceBindBlock 的执行也是惰性的,只有在获取 bindSequence.head 时,才会执行将数字转换成 RACUnarySequence 对象,最后通过 head 属性取出来。 lazySequence 和 eagerSequence
上一节的代码中展示的所有序列都是惰性的,而在整个 ReactiveCocoa 中,所有的 RACSequence 对象在默认情况下都是惰性的,序列中的值只有在真正需要使用时才会被展开,在其他时间都是 unresolved。
RACSequence 中定义了两个分别获取 lazySequence 和 eagerSequence 的属性:@property (nonatomic, copy, readonly) RACSequence<ValueType> *eagerSequence;@property (nonatomic, copy, readonly) RACSequence<ValueType> *lazySequence;
笔者一直认为在大多数情况下,在客户端上的惰性求值都是没有太多意义的,如果一个序列的长度没有达到比较庞大的数量级或者说计算量比较小,我们完全都可以使用贪婪求值(Eager Evaluation)的方式尽早获得结果;