protocol OperationQueue {
var suspended: Bool { get set }
var operationCount: Int { get }
func addOperationWithBlock(block: () -> Void)
func cancelAllOperations()
func waitUntilAllOperationsAreFinished()
}
然后,在OS X(或任何其他Apple平台)上,您可以直接使用GCD:
extension NSOperationQueue: OperationQueue { }
在所有其他系统上,您可以创建自己的实现:
class POSIXOperationQueue: OperationQueue { /* implementation with pthread */ }
class Win32OperationQueue: OperationQueue { /* implementation with Win32 API */ }
Official doc Swift内置了对以结构化方式编写异步和并行代码的支持。 Concurrency vs Parallelism(https://stackoverflow.com/a/63744581/4770877) Sync vs Async(https://stackoverflow.com/a/75225609/4770877) 它是一种从Swift v5.5到iOS v15和v13的向后兼容性 解决了:
4条答案
按热度按时间r55awzrz1#
Swift语言还没有支持并发的结构,有传言说这些结构将被添加到该语言的未来版本中,但同时,我认为没有操作系统的支持,你无法做到这一点。
由于GCD块是Swift闭包,因此GCD在Swift中提供了相当干净的并发解决方案,但它不依赖于平台(至少在苹果生态系统之外是这样)。
编辑:
我想您可以使用POSIX编写一个并发库,该库可以在所有POSIX兼容的操作系统上运行,但Windows并不真正兼容POSIX,因此这可能也不是一个完美的解决方案。
编辑#2:
在Swift 3中,GCD接口已经被清理,变得更加"敏捷"。现在有了一个Dispatch类,它有类方法来做以前使用全局函数的事情。
yvfmudvl2#
您可以创建一个简单的基于队列的调度抽象,如下所示:
然后,在OS X(或任何其他Apple平台)上,您可以直接使用GCD:
在所有其他系统上,您可以创建自己的实现:
bxpogfeg3#
从Swift 5.5开始,Swift现在支持内置语言特性的并发,如
async/await
、任务、任务组、参与者和结构化并发。mklgxw1f4#
Official doc
Swift内置了对以结构化方式编写异步和并行代码的支持。
Concurrency vs Parallelism(https://stackoverflow.com/a/63744581/4770877)
Sync vs Async(https://stackoverflow.com/a/75225609/4770877)
它是一种从Swift v5.5到iOS v15和v13的向后兼容性
解决了:
高层结构:
await/async
(func,let)标记,用于识别异步函数并运行它们。您可以在回调中使用withCheckedThrowingContinuation
和withCheckedContinuation
来支持await/asyncTask
-创建一个并发环境,其中允许await/async
,它在创建后立即启动,可以在创建时设置优先级并可以取消,因此具有自己的生命周期-当前状态。Task.init(priority:operation:)
创建非结构化并发(没有父任务)Task Group
-允许运行并行(比await async let
更具动态性)任务并完成所有任务-任务组已完成。使用TaskGroup.addTask
或await async let
时会创建结构化并发,因为它在任务和taskGroup之间具有显式父子关系Actor
(https://stackoverflow.com/a/75137101/4770877)-在并发环境中的tasks
之间共享数据,以防止数据争用示例:
Kotlin Coroutine(https://stackoverflow.com/a/65169350/4770877)