微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐