从一开始,Swift 就提供了一些使 ObjC 和 C 更加 Swifty 的工具,每个版本都添加了更多功能。现在,在 Swift 3 中,新的“作为成员导入”功能允许框架具有某些风格的 C API——在那里你有一个像类一样工作的数据类型,以及一堆全局函数来使用它——更像是 Swift 原生 API。数据类型作为 Swift 类导入,它们相关的全局函数作为这些类的方法和属性导入,一些相关的东西,比如常量集,可以在适当的时候成为子类型。
在 Xcode 8 / Swift 3 beta 中,Apple 已应用此功能(以及其他一些功能)来使 Dispatch 框架更加 Swifty。(还有Core Graphics。)如果你一直在关注 Swift 的开源工作,这不是新闻,但现在是它第一次成为 Xcode 的一部分。
将任何项目迁移到 Swift 3 的第一步应该是在 Xcode 8 中打开它,然后在菜单中选择Edit > Convert > To Current Swift Syntax...。这将应用(在您的审核和批准下)所有重命名的 API 和其他更改所需的所有更改。(通常,一行代码同时受到多个这些更改的影响,因此响应错误修复 - 单独响应可能无法正确处理所有内容。)
结果是,将工作弹回背景并返回的常见模式现在如下所示:
// Move to a background thread to do some long running work
DispatchQueue.global(qos: .userInitiated).async {
let image = self.loadOrGenerateAnImage()
// Bounce back to the main thread to update the UI
DispatchQueue.main.async {
self.imageView.image = image
}
}
请注意,我们正在使用.userInitiated
而不是旧DISPATCH_QUEUE_PRIORITY
常量之一。服务质量 (QoS) 说明符是在 OS X 10.10 / iOS 8.0 中引入的,为系统确定工作优先级和弃用旧的优先级说明符提供了更清晰的方法。有关详细信息,请参阅 Apple关于后台工作和能源效率的文档。
顺便说一句,如果您保留自己的队列来组织工作,那么现在获取队列的方法如下所示(注意这DispatchQueueAttributes
是一个OptionSet
,因此您使用集合样式的文字来组合选项):
class Foo {
let queue = DispatchQueue(label: "com.example.my-serial-queue",
attributes: [.serial, .qosUtility])
func doStuff() {
queue.async {
print("Hello World")
}
}
}
以后dispatch_after
用来上班吗?这也是队列上的一种方法,它需要 a DispatchTime
,它具有各种数字类型的运算符,因此您可以添加整秒或小数秒:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
您可以通过在 Xcode 8 中打开新的 Dispatch API 界面来找到自己的方式——使用 Open Quickly 找到 Dispatch 模块,或者DispatchQueue
在您的 Swift 项目/playground 中放置一个符号(如 )并命令单击它,然后浏览从那里开始的模块。(您可以在 Apple 漂亮的新 API 参考网站和 in-Xcode 文档查看器中找到 Swift Dispatch API,但看起来 C 版本的文档内容还没有移入其中。)
有关更多提示,请参阅迁移指南。