线程

GCD队列的封装,带有一些很酷的特性

从包括主线程在内的任何线程安全地在主线程上执行同步任务

Queue.main.sync {
    // your task on main thread
}

可排队

通过使用您自己的模拟或 SpryKit 框架中现有的 Fake 来覆盖真实实现,该协议可以帮助您在不使用线程的情况下测试您的代码。

延迟队列

让您可以根据自己的判断以参数形式轻松管理任务的执行。您不仅可以管理在哪个队列中执行,还可以管理如何执行 - 同步或异步。

使用标准队列

Queue.background.async
Queue.utility.asyncAfter

或者轻松创建您自己的队列

Queue.custom(label: “my line”).async
Queue.custom(label: “my line”, qos: .utility).async

由于显式参数的存在,您永远不会在创建队列时出错

Queue.custom(label: “my line”, attributes: .serial).async

并发处理方案

有时很难避免并发隔离问题。这是一个避免它的简单解决方案。只需使用 isolatedMain 队列在主线程上执行您的任务,而不会产生任何副作用。

Queue.isolatedMain.sync {
    // your task on main thread
}

Queue.isolatedMain.sync {
    // or return value from main thread
    return 42
}

Queue.isolatedMain.sync {
    // or throw error from main thread
    return try someThrowingFunction()
}

USendable - 是一种结构体,可帮助您避免对非 Sendable 对象(例如,使用 UI 元素)进行并发检查。它不是万能药,但它可以帮助您避免一些问题。

警告

使用风险自负。

let unsafe = USendable(ImageView())
Queue.main.async {
    let view = unsafe.value
    // make your magic
}