美文网首页
Swift--GCD的使用

Swift--GCD的使用

作者: 走停2015_iOS开发 | 来源:发表于2018-04-04 10:49 被阅读19次
DispatchQueue

DispatchQueue是一个类似线程的概念,这里称作对列队列是一个FIFO数据结构,意味着先提交到队列的任务会先开始执行)。DispatchQueue背后是一个由系统管理的线程池。

let queue = DispatchQueue(label: "com.Leo.demoQueue")
let qos =  DispatchQoS.default
let attributes = DispatchQueue.Attributes.concurrent
let autoreleaseFrequency = DispatchQueue.AutoreleaseFrequency.never
let queue = DispatchQueue(label: label, qos: qos, attributes: attributes, 
autoreleaseFrequency: autoreleaseFrequency, target: nil)
  • label 队列的标识符,方便调试
  • qos 队列的quality of service。用来指明队列的“重要性”。
  • attributes 队列的属性。类型是DispatchQueue.Attributes,是一个结构体,遵循了协议OptionSet。意味着你可以这样传入第一个参数[.option1,.option2]
  • autoreleaseFrequency。顾名思义,自动释放频率。有些队列是会在执行完任务后自动释放的,有些比如Timer等是不会自动释放的,是需要手动释放。
队列分类
  1. 从创建者来讲,队列可以分为两种,其中系统创建的队列又分为两种以及主队列/全局队列获取方法
  • 主队列(对应主线程)
  • 全局队列
let mainQueue = DispatchQueue.main
let globalQueue = DispatchQueue.global()
let globalQueueWithQos = DispatchQueue.global(qos: .userInitiated)
  1. 从任务的执行情况来讲,可以分为
  • 串行(serial)
  • 并行(concurrent)
    创建一个串行/并行队列
let serialQueue = DispatchQueue(label: "com.leo.serialQueue")
let concurrentQueue =
 DispatchQueue(label: "com.leo.concurrentQueue",attributes:.concurrent)
async

async 提交一段任务到队列,并且立刻返回
我们新建一个方法来模拟一段很长时间的任务,比如读一张很大的图

public func readDataTask(label:String){
    NSLog("Start sync task%@",label)
    sleep(2)
    NSLog("End sync task%@",label)
}
Tips:如果代码运行在Playground里,记得在最上面加上这两行。
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

然后,我们来看看在serialconcurrent队列上,任务的执行情况。

let serialQueue = DispatchQueue(label: "com.leo.serialQueue")
print("Main queue Start")
serialQueue.async {
    readDataTask(label: "1")
}
serialQueue.async {
    readDataTask(label: "2")
}
print("Main queue End")

打印结果:
Main queue Start
Main queue End
2017-01-04 22:51:40.909 GCD[28376:888938] Start task: 1
2017-01-04 22:51:42.979 GCD[28376:888938] End task: 1
2017-01-04 22:51:42.980 GCD[28376:888938] Start task: 2
2017-01-04 22:51:45.051 GCD[28376:888938] End task: 2

再来看看concurrent队列

print("Main queue Start")
let concurrentQueue = DispatchQueue(label: 
"com.leo.concurrent", attributes: .concurrent)
concurrentQueue.async {
    readDataTask(label: "3")
}
concurrentQueue.async {
    readDataTask(label: "4")
}
print("Main queue End")

打印结果:
Main queue Start
Main queue End
2017-01-04 23:06:36.659 GCD[28642:902085] Start task: 3
2017-01-04 23:06:36.659 GCD[28642:902070] Start task: 4
2017-01-04 23:06:38.660 GCD[28642:902085] End task: 3
2017-01-04 23:06:38.668 GCD[28642:902070] End task: 4
async

async 提交一段任务到队列,并且阻塞当前线程,任务结束后当前线程继续执行

let serialQueue = DispatchQueue(label: "com.leo.queue")
print("Main queue Start")
serialQueue.sync {
    readDataTask(label: "1")
}
print("Main queue End")
打印结果:
Main queue Start
2017-01-04 23:21:29.422 GCD[28796:912732] Start task: 1
2017-01-04 23:21:31.423 GCD[28796:912732] End task: 1
Main queue End

参考文章
GCD精讲(Swift 3&4)

相关文章

  • Swift--GCD的使用

    DispatchQueue DispatchQueue是一个类似线程的概念,这里称作对列队列是一个FIFO数据结构...

  • iconfont的使用(下载使用)

    1、下载文件 2、在生命周期中引入项目 beforeCreate () { var domModule = ...

  • Gson的使用--使用注解

    Gson为了简化序列化和反序列化的过程,提供了很多注解,这些注解大致分为三类,我们一一的介绍一下。 自定义字段的名...

  • 记录使用iframe的使用

    默认记录一下----可以说 这是我第一次使用iframe 之前都没有使用过; 使用方式: 自己开发就用了这几个属...

  • with的使用

    下面例子可以具体说明with如何工作: 运行代码,输出如下

  • this的使用

    什么是this? this是一个关键字,这个关键字总是返回一个对象;简单说,就是返回属性或方法“当前”所在的对象。...

  • this的使用

    JS中this调用有几种情况 一:纯粹的函数调用 这是函数的最通常用法,属于全局性调用,因此this就代表全局对象...

  • ==的使用

    积累日常遇到的编码规范,良好的编码习惯,持续更新。。。 日常使用==用于判断的时候,习惯性将比较值写前面,变量写后...

  • this的使用

    1.默认绑定,就是函数立即执行。 函数立即执行就是指向window,但是如果是node环境,就是指向全局conso...

  • %in% 的使用

    写在前面:From 生信技能书向量难点之一:%in% 难点 (1)== 与 %in% 的区别== 强调位置,x和对...

网友评论

      本文标题:Swift--GCD的使用

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