一个开源库,提供实用工具和扩展,以支持 Swift async/await 并发。
作为 XII 的 iOS、macOS 和 watchOS 应用程序中各种项目的可重用组件而开发。
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
。
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
耗尽。