快速浏览Grand Central Dispatch和Swift 3

多线程和并发对于现代应用程序是必不可少的……但是,Grand Central Dispatch是用于管理并发操作的系统级库,它具有iOS SDK中较为麻烦且不友好的API之一。

不再。

Swift 3带来了对Grand Central Dispatch语法和用法的许多改进。 这是一些新功能的快速浏览。

dispatch_async

以前,我们将选择调度方法(同步与异步),然后选择要向其调度任务的队列。 更新后的GCD会颠倒顺序-我们首先选择队列,然后应用调度方法。

最常见的GCD模式之一是在全局后台队列上执行工作,并在工作完成后立即更新主队列上的UI。 新API的外观如下:

队列属性

您会注意到,队列现在在init上具有属性。 这是一个Swift OptionSet,可以包括队列选项,例如串行与并发,内存和活动管理选项以及服务质量(.default,.userInteractive,.userInitiated,.utility和.background)。

服务质量取代了iOS8中不推荐使用的旧优先级属性。 如果您习惯了优先级队列,请按照以下方法将它们映射到QOS案例:

  * DISPATCH_QUEUE_PRIORITY_HIGH:.userInitiated 
* DISPATCH_QUEUE_PRIORITY_DEFAULT:.default
* DISPATCH_QUEUE_PRIORITY_LOW:.utility
* DISPATCH_QUEUE_PRIORITY_BACKGROUND:.background

内存和活动管理选项是今年的Apple OS版本(OSX 10.12,iOS 10.0,tvOS 10.0,watchOS 3.0)的新增功能。 这些功能包括使用.initiallyInactive在非活动状态下启动队列或使用.autoreleaseInherit,.autoreleaseNever和.autoreleaseWorkItem为队列设置自定义自动释放设置的功能。

工作项目

队列不是GCD获得Swift OptionSet的唯一部分。 工作项目也有更新的Swift语法:

现在,工作项可以在初始化时声明质量或服务和/或标志。 这两个都是可选的,并且会影响工作项的执行。 这些标志是一个选项集,其中包括以下选项:barrier,detached,assignCurrentContext,noQoS,InheritanceQoS,forceforceQoS。

一次派遣

dispatch_once对于初始化代码和仅执行一次的其他功能非常有用。

在Swift 3中,不建议使用dispatch_once,而应将其替换为全局或静态变量和常量。

dispatch_time_t

dispatch_time_t是将指定时间转换为可以提供给队列的UInt64的函数。 更新的GCD为此引入了更友好的语法(告别NSEC_PER_SEC)。 这是一个使用after之后的示例:

.seconds是名为DispatchTimeInterval的新枚举的一部分。 这些案例具有一个代表计数的关联值。 目前支持:

  * .seconds(Int) 
* .milliseconds(Int)
* .microseconds(Int)
* .nanoseconds(Int)

dispatch_assert

派遣前提是今年Apple OS发行版中的新增内容。 这些替换了dispatch_assert,并允许您在执行代码之前检查您是否在预期的线程上。 这对于更新UI且必须在主队列上执行的功能特别有用。 这是一个简单的例子:

额外资源

Swift 3包含更多的GCD改进,但是在撰写本文时,官方文档仍不完整。 更深入地讲:

苹果/迅捷进化
swift-evolution –保留了对Swift编程语言进行更改和用户可见的增强的建议。 github.com 在Swift 3中使用GCD并发编程
Swift 3提供了新的界面,使使用Grand Central Dispatch编写应用程序比以往更加容易。 学习… developer.apple.com 苹果/ swift-corelibs-libdispatch
swift-corelibs-libdispatch – libdispatch项目,(又名Grand Central Dispatch),用于多核并发… github.com