Operator之元素减少(Reducing elements)
collect
collect
表达了收集的核心思想,collect
一共有4种不同的用法:
.collect()
,当没有任何参数时,它会收集publisher发送地所有数据,直到收到.finished
事件。相信大家应该也意识到了,这种用法可能会造成内存方面的问题,collect会把publisher发送的数据保存在内存之中,因此,这种情况需要考虑数据量的问题。.collect(3)
,当给其一个count参数时,它会按照指定的个数来收集数据,这就避免了内存溢出的问题。我们称这种收集数据的维度为空间维度。比如,我们上图中设置的count为3,当数据满3个的时候就会收集一次。如果在收到.finished
事件之后个数不满3个,则先发送剩余的数据,然后结束pipline。.collect(.byTime(q, 1.0))
,试想,收集数据的维度不仅仅只有空间维度,还有时间维度,我们可以收集某个时间间隔内的数据,这就是byTime
这个参数的用处.collect(.byTimeOrCount(q, 1.0, 5))
,如果在时间维度上再加上空间维度就更完美了
ignoreOutput
ignoreOutput
能够忽略publisher发送的数据
["1", "2", "3"].publisher
.ignoreOutput()
.sink(receiveCompletion: { completion in
print(".sink() received the completion", String(describing: completion))
switch completion {
case .finished:
finishReceived = true
break
case .failure(let anError):
print("received error: ", anError)
failureReceived = true
break
}
}, receiveValue: { _ in
print(".sink() data received")
})
reduce/tryReduce
reduce
按照闭包的规则把数据写到内存中,只有当publisher发送数据完毕后,才会把收集到的所有数据一次性发出去。
_ = [1, 2, 3, 4, 5, 6, 7, 8]
.publisher
.reduce([], { preValue, newValue -> [Int] in
return preValue + [newValue]
})
.sink(receiveCompletion: { completion in
print("结束了")
switch completion {
case .finished:
print("完成")
break
case .failure(let error):
print("错误:\(error.localizedDescription)")
break
}
}, receiveValue: { someValue in
print("someValue: \(someValue)")
})