Stream

Stream 是一个 Swift 库,使你能够为中型或大型数据集创建可扩展的数据管道。

特性

Stream 管道允许你通过以下方式高效地处理大型甚至无限的集合:

安装

你可以通过 SwiftPM 安装它,方法如下:

.package(url: "https://github.com/cgarciae/Stream", from: "0.0.7")

它可能适用于其他兼容的包管理器。

示例

任何 Sequence 都可以通过 .stream 属性转换为 Stream,之后你可以使用其自定义的函数式方法,如 mapfilter 等,来并行/并发地处理数据。

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)
    }

背压

要管理资源,你可以使用 maxTasksqueueMax 参数。

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 将暂停,直到其使用者请求更多元素。

架构

成员

元数据

Cristian Garcia – cgarcia.e88@gmail.com

在 MIT 许可证下分发。有关更多信息,请参见 LICENSE。