0
点赞
收藏
分享

微信扫一扫

Swift5多线程系列一GCD基础篇

木樨点点 2022-03-15 阅读 30
swiftiosui

Swift5多线程系列-基础概念篇

iOS开发,多线程开发常用GCD,swift也如是;swift的GCD,使用比OC上更加简单易上手;


GCD基础篇目录

基础篇

1. 串行、并行、同步、异步


  • 串行:在本文中指串行队列,多个任务放在串行队列里执行,只能按顺序依次运行,前一个运行完成,下一个才能开始运行;前一个没运行完,后一个只能排队等着。以此类推,直到所有任务都运行完成。
  • 并行:在本文中指并行队列,多个任务放在并行队列里执行,可以同时运行。
  • 同步:在本文中指同步执行任务,是在一个线程里按顺序执行多项任务,执行结束的顺序是固定的、和任务的执行顺序相同。总耗时是所有任务耗时之和。
  • 异步:在本文中指异步执行任务,也是按顺序执行多项任务,但是是放在多个线程里同时运行,执行结束的顺序是随机的、不可预估的。总耗时大约是耗时最长的那项任务所消耗的时间。

2. DispatchWorkItem


官网原文:The work you want to perform, encapsulated in a way that lets you attach a completion handle or execution dependencies.

调度工作项初始化,正常情况下,使用第一种方式即可(特殊情况后续会再讲解):

//1. 只带尾随闭包
let item1 = DispatchWorkItem {
    print("item1")
}
//2. 指定qos(执行优先级)或flags(特殊行为标记)
let item2 = DispatchWorkItem(qos: .userInteractive, flags: .barrier) {
    print("item2")
}

3. DispatchQueue 简介


官网原文:An object that manages the execution of tasks serially or concurrently on your app’s main thread or on a background thread.

DispatchQueue 有三种类型:

  • Main queue
  • Global queue
  • Custom queue

3.1 Main queue(主队列,串行)

Main queue 与主线程关联的调度队列,是一种串行队列(Serial),与 UI 相关的操作必须放在 Main queue 中执行,获取方式是:

let mainQueue = DispatchQueue.main

3.2 Global queue(全局队列,并行)

Global queue 运行在后台线程,是系统内共享的全局队列,是一种并行队列(Concurrent),用于处理并发任务,获取方式是:

let globalQueue = DispatchQueue.global()

3.3 Custom queue(自定义队列,默认串行)

Custom queue 运行在后台线程,默认是串行队列(Serial),初始化时指定 attributes 参数为 .concurrent,可以创建成并行队列(Concurrent),创建方式如下:

//串行队列,label名字随便取
let serialQueue = DispatchQueue(label: "queuename")

//并行队列
let concurrentQueue = DispatchQueue(label: "queuenamedemo", attributes: .concurrent)

4. DispatchGroup 简介


官网原文:A group of tasks that you monitor as a single unit.

DispatchGroup 可以很方便的管理多项任务。比如当同一组里的所有事件都完成后,GCD API 可以发送通知,执行相应的操作。常用方法:

  • notify():调度组里的所有任务执行完毕,会在此收到通知,不会阻塞当前线程。
  • wait():一直等待,直到调度组里所有任务都执行完毕或等待超时,阻塞当前线程。

总结

`要精通Swift多线程,还是要多在实践中使用,在使用过程中反复思索、反复优化,这项技术很快就会成为你的拿手好戏。

举报

相关推荐

0 条评论