Stream 是一个 Swift 库,使你能够为中型或大型数据集创建可扩展的数据管道。
Stream 管道允许你通过以下方式高效地处理大型甚至无限的集合:
你可以通过 SwiftPM 安装它,方法如下:
.package(url: "https://github.com/cgarciae/Stream", from: "0.0.7")
它可能适用于其他兼容的包管理器。
任何 Sequence
都可以通过 .stream
属性转换为 Stream
,之后你可以使用其自定义的函数式方法,如 map
、filter
等,来并行/并发地处理数据。
import Stream
_ = getURLs()
.stream
.map {
downloadImage($0)
}
.filter {
validateImage($0)
}
.flatMap {
getMultipleImageSizes($0)
}
.forEach {
storeImage($0)
}
Stream
继承自 LazySequence
,因此你可以像处理普通的 Sequence 一样处理它,用于其他目的。默认情况下,每个 Stream 的结果可能会以任何顺序出现,这样可以获得更好的性能,但如果你确实想保持顺序,你可以通过 .inOrder
属性将 Stream
转换为 OrderedStream
。
import Stream
_ = getURLs()
.stream
.inOrder
.map {
downloadImage($0)
}
.filter {
validateImage($0)
}
.flatMap {
getMultipleImageSizes($0)
}
要管理资源,你可以使用 maxTasks
和 queueMax
参数。
import Stream
_ = getURLs()
.stream
.map(maxTasks: 4, queueMax: 10) {
downloadImage($0)
}
.filter(maxTasks: 2, queueMax: 15) {
validateImage($0)
}
.flatMap(maxTasks: 5, queueMax: 25) {
getMultipleImageSizes($0)
}
.forEach(maxTasks: 3,queueMax: 20) {
storeImage($0)
}
maxTasks
将控制 Stream 创建的 GCD 任务的数量,queueMax
将限制允许同时存在于输出队列中的元素的最大数量。如果输出队列已满,任务最终将被阻塞,并且 Stream 将暂停,直到其使用者请求更多元素。
map
flatMap
filter
forEach
Cristian Garcia – cgarcia.e88@gmail.com
在 MIT 许可证下分发。有关更多信息,请参见 LICENSE。