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

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


GCD基础篇目录

  • Swift5多线程系列-基础概念篇
    • 基础篇
      • 1. 串行、并行、同步、异步
      • 2. DispatchWorkItem
      • 3. DispatchQueue 简介
        • 3.1 Main queue(主队列,串行)
        • 3.2 Global queue(全局队列,并行)
        • 3.3 Custom queue(自定义队列,默认串行)
      • 4. DispatchGroup 简介
    • 总结

基础篇

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


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

2. DispatchWorkItem


调度工作项:其实就是一项任务,可以把你想要执行的代码写成闭包,在 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 简介


调度队列:一个对象,用来管理任务在 app 的主线程或后台线程串行或并行执行。

官网原文: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多线程,还是要多在实践中使用,在使用过程中反复思索、反复优化,这项技术很快就会成为你的拿手好戏。

Swift5多线程系列一GCD基础篇相关推荐

  1. Swift5多线程系列一GCD异步/延时使用初步封装

    Swift5多线程系列一GCD异步/延时使用初步封装 GCD异步延时使用初步目录 Swift5多线程系列一GCD异步/延时使用初步封装 前言 一.封装成基本的struct 二.基本使用 1.异步初步任 ...

  2. 手摸手,带你用vue撸后台 系列一(基础篇) - 掘金

    完整项目地址:vue-element-admin 系列文章: 手摸手,带你用 vue 撸后台 系列一(基础篇) 手摸手,带你用 vue 撸后台 系列二(登录权限篇) 手摸手,带你用 vue 撸后台 系 ...

  3. QT/C++从新手到老手系列之QT基础篇-李浩林-专题视频课程

    QT/C++从新手到老手系列之QT基础篇-1620人已学习 课程介绍         本系列课程励志于带领你学习QT5/C++,从开发环境(QTCreator和VS2013两种)搭建到实际项目实战,从 ...

  4. 调试器工作原理系列一: 基础篇

    调试器工作原理系列一: 基础篇 本文是一系列探究调试器工作原理的文章的第一篇.我还不确定这个系列需要包括多少篇文章以及它们所涵盖的主题,但我打算从基础知识开始说起. 关于本文 我打算在这篇文章中介绍关 ...

  5. 视频教程-Linux系列课程(基础篇)-Linux

    Linux系列课程(基础篇) 2年JavaEE开发 ,5年资深大数据开发大牛,曾就职于蓝点科技,擅长精准广告系统开发,精通Linux操作系统! 具备丰富的大数据研发和培训经验,熟练运用Hadoop和S ...

  6. nodejs missing script: dev_nodejs深入学习系列之v8基础篇

    V8这个概念大家都不陌生了,那么你动手编译过V8源码吗?编译后有尝试去了解V8背后的一些概念吗?如果没有,那么也不用心慌,下文将跟大家一一解释这些东西.在编译V8之前我们先要了解一个东西-构建系统 1 ...

  7. proe输入数字时成双出现_职场数据控系列,超市基础篇,商品双ABC分析法及应用...

    在上一篇文章中介绍了:商品ABC分析法,本篇文章中就对商品ABC分析后的又一拓展应用:双ABC分析及应用做基础介绍:请超市行业的同行朋友们指正,觉得有帮助的,恳请关注收藏,油条小编将持续更新零售超市相 ...

  8. iOS多线程系列之GCD栅栏(barrier)实现同步锁

    多线程编程中很容易出现资源竞争的问题,比如异步读写操作造成数据不同步.那么解决这一问题多线程编程中提供了一种同步机制叫同步锁.iOS中实现同步锁机制的方案不止一种,这里主要介绍一下强大的GCD给出的方 ...

  9. java多线程系类:基础篇:10生产者消费者的问题

    概要 本章,会对"生产/消费者问题"进行讨论.涉及到的内容包括: 1. 生产/消费者模型 2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/sk ...

最新文章

  1. SilverLight学习笔记--如何解决Button不响应MouseLeftButtonDown与MouseLeftButtonUp事件的问题...
  2. 【物联网】 AR9344开发环境的搭建和编译固件
  3. Android之调用系统分享
  4. Golang语言写99乘法表-双重for循环
  5. 数组排序(冒泡、排序)
  6. mysql如何导出sql文件_MYSQL导入导出.sql文件
  7. 洛谷OJ测评常见的错误
  8. 计算机网络视频信号怎么传,如何将摄像机视频信号通过NDI传输到Zoom会议软件...
  9. Cisco Packet Tracer路由器的基本命令
  10. 大一学生《web课程设计》用DIV+CSS技术设计的个人网页(网页制作课作业)
  11. 计算机网络密码凭据,win7系统共享提示输入网络凭据用户名密码的解决办法
  12. windows下命令行格式化U盘
  13. 51单片机-PWM调速(直流电机,智能小车的电机调速)
  14. ESD防护选型思路(二)
  15. PhotoShop cc合并多张静态图片为gif动画
  16. 【Linux】【Kernel】BUG: scheduling while atomic问题分析
  17. 为保证系统的可用性的事前事中事后
  18. Variable conv1/weights already exists, disallowed. Did you mean to set reuse=True...tensorflow报错
  19. 评估托管SDWAN服务
  20. 一些好用的Mac软件推荐

热门文章

  1. 通过代码来申请CA证书
  2. 爱立信CEO卫翰思否认将被思科收购
  3. [Maya API]二、Maya API的三种类型
  4. 《python程序设计实践》课程设计报告(胡润百富榜数据爬取及分析)
  5. 存储过程--异常处理机制(Begin try Begin Catch)
  6. Scala高级编程之偏函数
  7. 半导体无尘车间粒子计数器的工作原理及应用分类
  8. Manjaro软件更新失败:无效或已损坏的软件包
  9. 「NOIP2016」天天爱跑步
  10. 那些好老公做不出的事(三)