从一开始,Swift就提供了一些使ObjC和C更加Swifty的功能,并为每个版本增加了更多功能。现在,在Swift 3中,新的“作为成员导入”功能使具有某些样式的C API的框架(其中您具有类似类的数据类型以及要使用的一系列全局函数)行为更像Swift原生API。数据类型作为Swift类导入,它们的相关全局函数作为这些类上的方法和属性导入,并且某些相关的东西(如常量集)可以在适当的时候成为子类型。
在Xcode 8 / Swift 3 beta中,Apple应用了此功能(以及其他一些功能)来使Dispatch框架更加迅速。(还有Core Graphics。)如果您一直在关注Swift开源工作,这不是新闻,但现在是Xcode的第一次。
将任何项目移动到Swift 3的第一步应该是在Xcode 8中将其打开,然后在菜单中选择“ 编辑”>“转换”>“到当前Swift语法... ”。这将适用于所有重命名的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
做工作吗?这也是队列中的一种方法,它需要一个DispatchTime
,其中包含用于各种数字类型的运算符,因此您可以添加整秒或小数秒:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
您可以通过在Xcode 8中打开新的Dispatch API的接口来找到自己的出路-使用“快速打开”找到Dispatch模块,或者DispatchQueue
在您的Swift项目/操场上放一个符号(如)并单击鼠标,然后在其中浏览从那里的模块。(您可以在Apple新颖的API参考网站和In-Xcode文档查看器中找到Swift Dispatch API,但看来C版本的文档内容尚未移入其中。)
有关更多提示,请参见《迁移指南》。