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

我有很多代码在Swift 2.x(或甚至1.x)项目,看起来像这样:
// 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,我得到各种错误。其中一些提供修复我的代码,但不是所有的修复工作。哈尔!

从一开始,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和其他更改,同时需要您的审核和批准所有更改。 (通常,代码行同时受到多个更改的影响,因此响应错误修复 – 它单独可能无法处理一切)。

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

// 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

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...