我如何dispatch_sync,dispatch_async,dispatch_after等在Swift 3?

我如何dispatch_sync,dispatch_async,dispatch_after等在Swift 3?,第1张

概述我有很多代码在Swift 2.x(或甚至1.x)项目,看起来像这样: // Move to a background thread to do some long running workdispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { let image = self.load 我有很多代码在Swift 2.x(或甚至1.x)项目,看起来像这样:
// Move to a background thread to do some long running workdispatch_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,我得到各种错误。其中一些提供修复我的代码,但不是所有的修复工作。哈尔!

从一开始,Swift提供了一些设施,使ObjC和C更多Swifty,每个版本增加更多。现在,在Swift 3中,新的 “import as member”特性允许具有某些样式的C API的框架 – 其中你有一个类似于一个类的数据类型,以及一些全局函数 – 更像Swift API。数据类型作为Swift类导入,它们相关的全局函数作为方法和这些类上的属性导入,以及一些相关的东西,例如常量集合,在适当的时候可以变成子类型。

在Xcode 8 / Swift 3测试版中,苹果已经应用了这个功能(以及其他几个),使dispatch框架更加Swifty。 (和Core Graphics一样。)如果你一直在跟踪Swift的开源工作,this isn’t news,但现在是第一次它是Xcode的一部分。

将任何项目移动到Swift 3的第一步应该是在Xcode 8中打开它,然后选择Edit>转换>到当前Swift语法…在菜单中。这将适用于所有重命名的API和其他更改,同时需要您的审核和批准所有更改。 (通常,代码行同时受到多个更改的影响,因此响应错误修复 – 它单独可能无法处理一切)。

结果是,d跳工作的背景和背面的常见模式现在看起来像这样:

// Move to a background thread to do some long running workdispatchQueue.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。

总结

以上是内存溢出为你收集整理的我如何dispatch_sync,dispatch_async,dispatch_after等在Swift 3?全部内容,希望文章能够帮你解决我如何dispatch_sync,dispatch_async,dispatch_after等在Swift 3?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1062418.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存