SwiftConcurrency 库

GitHub

一个开源库,提供实用工具和扩展,以支持 Swift async/await 并发。

作为 XII 的 iOS、macOS 和 watchOS 应用程序中各种项目的可重用组件而开发。

安装

Swift Package Manager

  1. 在 Xcode 中,选择 “File” > “Swift Packages” > “Add Package Dependency”。
  2. 按照提示使用此仓库的 URL
  3. 选择 SwiftConcurrency 库添加到您的项目中

许可证

请参阅 LICENSE 文件。

使用指定的秒数延迟启动 Task (Source)

extension Task where Failure == Error {
  init(
    delaySeconds: Double,
    priority: TaskPriority? = nil,
    operation: @escaping @Sendable () async throws -> Success
  )
}

extension Task where Failure == Never {
  init(
    delaySeconds: Double,
    priority: TaskPriority? = nil,
    operation: @escaping @Sendable () async -> Success
  )
}

创建一个具有可选优先级的任务,该任务在初始延迟(以秒为单位)后执行给定的操作。

这是启动任务然后调用 Task.sleep 并使用等待的纳秒数的简写形式。

Task::sleep,但以秒为单位 (Source)

extension Task {
  static func sleep(seconds duration: Double) async throws
}

暂停当前任务至少给定的秒数,除非任务被取消。如果任务被取消,则抛出 CancellationError 而不等待持续时间。此函数会阻塞底层线程。

使用 Task 轮询操作完成状态 (Source)

extension Task {
  static func poll(
    intervalSeconds: Double,
    timeoutSeconds: Double,
    action: @escaping () async throws -> Bool
  ) async throws
}

以特定的时间间隔执行轮询操作,如果在超时时间内操作未返回 true,则超时。

如果轮询操作成功,则返回 true;如果任务超时或已取消,则返回 false

通过并行工作队列处理工作项 (Source)

struct ParallelProcessing {
  static let DEFAULT_MAX_PARALLEL_TASKS = 4

  static func processItemsInParallel<Item, Result>(
    items: [Item],
    maxParallelTasks: Int = DEFAULT_MAX_PARALLEL_TASKS,
    processInRandomOrder: Bool = true,
    processItem: @escaping (Item) async -> Result?
  ) async -> [Result]
}

将处理任务 (processItem) 并行应用于每个项目。限制处理的最大并行度为 maxParallelTasks,以限制创建的线程数。

提供的所有项目都添加到工作队列中,然后由多个并行 Task 耗尽。