ReactiveCocoa有一个collect
运算符,它将所有下一个值聚合到一个数组中,直到信号或生成器完成,然后发送该聚合值。我需要的是一个渐进式收集运算符,其中值将被收集到一个数组中,直到过滤条件被传递,此时数组将被转发,操作符将在空数组中重新开始并重新聚合值。
例如,如果给定的生产者按顺序发出值1,2,3,4,5,6,7,8,9以及collectWhile
运算符:
producer.collectWhile { $0 % 5 == 0 }.on(next: { print($0) })
有两个印刷声明:
[1, 2, 3, 4]
和[5, 6, 7, 8, 9]
此时self
将完成,collectWhile
运算符也将完成。
collect
由reduce
构建,但它使用私有数据结构:
/// A reference type which wraps an array to avoid copying it for performance and
/// memory usage optimization.
private final class CollectState<Value> {
var values: [Value] = []
func append(value: Value) -> Self {
values.append(value)
return self
}
}
为了避免复制聚合值,所以我假设我可能不得不在我的实现中做类似的事情。任何人都对如何完成我正在寻找的行为有任何想法?