多线程之GCD

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 多线程 在iOS开发中为提高程序的运行效率会将比较耗时的操作放在子线程中执行,iOS系统进程默认启动一个主线程,用...
    郭豪豪阅读 2,722评论 0 4
  • 什么是 GCD GCD 是 libdispatch 的市场名称,而 libdispatch 作为 Apple 的一...
    MaZengyi阅读 566评论 0 0
  • 1. GCD简介 什么是GCD呢?我们先来看看百度百科的解释简单了解下概念 引自百度百科:Grand Centra...
    千寻_544f阅读 506评论 0 0
  • iOS多线程之GCD 什么是GCD GCD(grand central dispatch) 是 libdispat...
    comst阅读 1,339评论 0 0
  • 每一个早晨,你是不是都在期待中醒来呢? 在你拉开窗帘的那一刻,无论阳光灿烂,还是狂风暴雨,你是不是都会满怀欣喜、感...
    只欢喜自渡阅读 1,246评论 8 11

友情链接更多精彩内容