美文网首页
多线程之GCD

多线程之GCD

作者: 杰森斯坦sen | 来源:发表于2018-04-27 14:37 被阅读0次

    GCD的队列分为串行队列和并行队列两类:

    串行队列:只有一个线程,加入到队列中的操作按添加顺序依次执行。
    并发队列:有多个线程,操作进来之后它会将这些队列安排在可用的处理器上,同时保证先进来的任务优先处理。

    串行队列

    使用串行队列时首先要创建一个串行队列,然后调用异步调用方法。

    let serialQueue = DispatchQueue(label: "serialQueue")
    

    并行队列

    使用串行队列时首先要创建一个串行队列,然后调用异步调用方法。

    let concurrentQueue = DispatchQueue(label: "concurrentQueue", qos: .utility, attributes: .concurrent)
    
    concurrentQueue.async {
    }
    
    

    在实际开发中我们通常使用DispatchQueue.global()方法取得一个全局的并行队列。

    DispatchQueue.global().async {
    
        DispatchQueue.main.async {
            // 更新UI操作
        }
    }
    

    attributes 参数也可以接受.initiallyInactive 的值。这样任务不会被自动执行,而是需要手动去触发。默认是串行队列,如果需要并行队列,需要attributes参数填加.concurrent。

    let anotherQueue = DispatchQueue(label: "anotherQueue", qos: .utility, attributes: .initiallyInactive)
    if let queue = inactiveQueue {
        queue.activate()
    }
    

    QoS

    上面初始化DispatchQueue时我们用了qos参数,用于指定任务重要程度以及优先级的信息。
    Apple定义的QoS优先级从高到低有:

    • userInteractive
    • userInitiated
    • default
    • utility
    • background
    • unspecified

    主队列默认拥有更高的优先级。
    全局队列默认优先级是default,也可以修改优先级,但是不建议这样做。

    let globalQueue = DispatchQueue.global(qos: .userInitiated)
    

    主队列和全局队列

    主队列和全局队列是系统定义的队列,也是我们最常用的队列。
    主队列是作为更新 UI 而使用。

    DispatchQueue.main.async {
        // 更新UI操作
    }
    

    全局队列是系统定义的并行队列,上面并行队列中有介绍过。

    DispatchWorkItem

    DispatchWorkItem 是一个代码块,它可以在任意一个队列上执行,因此它里面的代码可以在后台运行,也可以在主线程运行。
    当一个任务项被调用后,你可以通知主队列或者其他队列。

    let workItem = DispatchWorkItem {
        // Do something
    }
    let queue = DispatchQueue.global()
    queue.async(execute: workItem)
    workItem.notify(queue: DispatchQueue.main) {
        // Do something
    }
    

    链接

    A deep dive into Grand Central Dispatch in Swift
    Swift 3 中的 GCD 与 Dispatch Queue

    相关文章

      网友评论

          本文标题:多线程之GCD

          本文链接:https://www.haomeiwen.com/subject/qwcvkftx.html