Swift 3中的GCD差异

2 concurrency grand-central-dispatch ios swift

Grand Central Dispatch当我注意到Swift 3改变了它的语法时,我正在学习.

那么,是这样的:

let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

    dispatch_async(queue) { () -> Void in

        let img1 = Downloader.downloadImageWithURL(imageURLs[0])

        dispatch_async(dispatch_get_main_queue(), {

            self.imageView1.image = img1
        })   
    }
Run Code Online (Sandbox Code Playgroud)

有什么不同吗?

DispatchQueue.global(qos: .default).async { [weak self]

            () -> Void in

            let img1 = Downloader.downloadImageWithURL(imageURLs[0])

            DispatchQueue.main.async {

                ()->Void in

                self?.imageView1.image = img1
            }

        }
Run Code Online (Sandbox Code Playgroud)

我应该创建一个包含的变量DispatchQueue.global(qos: .default).async吗?

Mac*_*ado 8

Swift 3为Grand Central Dispatch语法和用法带来了许多改进.

以前,我们会选择调度方法(sync vs async),然后选择我们要将任务调度到的队列.更新的GCD反转此顺序 - 我们首先选择队列,然后应用调度方法.

DispatchQueue.global(attributes: [.qosDefault]).async { 
    // Background thread
    DispatchQueue.main.async(execute: { 
        // UI Updates
    })
}
Run Code Online (Sandbox Code Playgroud)

队列属性

您会注意到队列现在在init上获取属性.这是一个Swift OptionSet,可以包括队列选项,如串行和并发,内存和活动管理选项以及服务质量(.default,.userInteractive,.userInitiated,.utility和.background).服务质量取代了iOS8中不推荐使用的旧优先级属性.如果你习惯了优先级队列,这里是他们如何映射到QOS案例:

* DISPATCH_QUEUE_PRIORITY_HIGH:         .userInitiated
* DISPATCH_QUEUE_PRIORITY_DEFAULT:      .default
* DISPATCH_QUEUE_PRIORITY_LOW:          .utility
* DISPATCH_QUEUE_PRIORITY_BACKGROUND:   .background
Run Code Online (Sandbox Code Playgroud)

工作项目

队列不是获取Swift OptionSet的GCD的唯一部分.还有一个更新的工作项Swift语法:

let workItem = DispatchWorkItem(qos: .userInitiated, flags: .assignCurrentContext) {
    // Do stuff
}
queue.async(execute: workItem)
Run Code Online (Sandbox Code Playgroud)

工作项现在可以在init上声明质量或服务和/或标志.这两个都是可选的,会影响工作项的执行.

dispatch_once

dispatch_once对初始化代码和其他只执行一次的函数非常有用.在Swift 3中,不推荐使用dispatch_once,应该用全局或静态变量和常量替换它.

// Examples of dispatch_once replacements with global or static constants and variables. 
// In all three, the initialiser is called only once. 

// Static properties (useful for singletons).
class Object {
    static let sharedInstance = Object()
}

// Global constant.
let constant = Object()

// Global variable.
var variable: Object = {
    let variable = Object()
    variable.doSomething()
    return variable
}()
Run Code Online (Sandbox Code Playgroud)

dispatch_assert

今年Apple OS发布的新版本也是发送前置条件.这些替换dispatch_assert并允许您在执行代码之前检查您是否在预期的线程上.这对于更新UI并且必须在主队列上执行的函数特别有用.这是一个简单的例子:

let queue = DispatchQueue.global(attributes: .qosUserInitiated)
let mainQueue = DispatchQueue.main

mainQueue.async {
    dispatchPrecondition(condition: .notOnQueue(mainQueue))
    // This code won't execute
}

queue.async {
    dispatchPrecondition(condition: .onQueue(queue))
    // This code will execute
}
Run Code Online (Sandbox Code Playgroud)

资料来源:https://medium.com/swift-and-ios-writing/a-quick-look-at-gcd-and-swift-3-732bef6e1838#.7hdtfwxb4