// Move to a background thread to do some long running work dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)) { let image = self.loadOrGenerateAnImage() // Bounce back to the main thread to update the UI dispatch_async(dispatch_get_main_queue()) { self.imageView.image = image } }
或者像这样的东西延迟执行:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW,Int64(0.5 * Double(NSEC_PER_SEC))),dispatch_get_main_queue()) { print("test") }
或者Grand Central Dispatch API的任何其他用途…
现在我已经打开我的项目在Xcode 8(测试版)为Swift 3,我得到各种错误。其中一些提供修复我的代码,但不是所有的修复工作。哈尔!
在Xcode 8 / Swift 3测试版中,苹果已经应用了这个功能(以及其他几个),使Dispatch框架更加Swifty。 (和Core Graphics一样。)如果你一直在跟踪Swift的开源工作,this isn’t news,但现在是第一次它是Xcode的一部分。
将任何项目移动到Swift 3的第一步应该是在Xcode 8中打开它,然后选择Edit>转换>到当前Swift语法…在菜单中。这将适用于所有重命名的API和其他更改,同时需要您的审核和批准所有更改。 (通常,代码行同时受到多个更改的影响,因此响应错误修复 – 它单独可能无法处理一切)。
结果是,弹跳工作的背景和背面的常见模式现在看起来像这样:
// Move to a background thread to do some long running work DispatchQueue.global(attributes: .qosUserInitiated).async { let image = self.loadOrGenerateAnImage() // Bounce back to the main thread to update the UI DispatchQueue.main.async { self.imageView.image = image } }
注意,我们使用qosUserInitiated而不是一个旧的DISPATCH_QUEUE_PRIORITY常量。在OS X 10.10 / iOS 8.0中引入了服务质量(QoS)说明符,为系统优先处理工作和废弃旧的优先级说明符提供了更清晰的方式。有关详细信息,请参阅Apple的docs on background work and energy efficiency。
顺便说一下,如果你保持自己的队列组织工作,获得一个方法现在看起来像这样(注意DispatchQueueAttributes是一个OptionSet,所以你使用收集风格的字面量组合选项):
class Foo { let myQueue = 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中打开它的接口找到你的方式 – 使用Open快速找到Dispatch模块,或者在你的Swift项目/ playground中放置一个符号(如DispatchQueue),然后命令点击它,然后打开围绕模块从那里。 (您可以在Apple的庞大的新API参考网站和in-Xcode doc查看器中找到Swift Dispatch API,但它似乎只是C版本的文档内容尚未移动到它)。
有关更多提示,请参阅Migration Guide。