Swift5多线程系列一GCD基础篇
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基础篇相关推荐
- Swift5多线程系列一GCD异步/延时使用初步封装
Swift5多线程系列一GCD异步/延时使用初步封装 GCD异步延时使用初步目录 Swift5多线程系列一GCD异步/延时使用初步封装 前言 一.封装成基本的struct 二.基本使用 1.异步初步任 ...
- 手摸手,带你用vue撸后台 系列一(基础篇) - 掘金
完整项目地址:vue-element-admin 系列文章: 手摸手,带你用 vue 撸后台 系列一(基础篇) 手摸手,带你用 vue 撸后台 系列二(登录权限篇) 手摸手,带你用 vue 撸后台 系 ...
- QT/C++从新手到老手系列之QT基础篇-李浩林-专题视频课程
QT/C++从新手到老手系列之QT基础篇-1620人已学习 课程介绍 本系列课程励志于带领你学习QT5/C++,从开发环境(QTCreator和VS2013两种)搭建到实际项目实战,从 ...
- 调试器工作原理系列一: 基础篇
调试器工作原理系列一: 基础篇 本文是一系列探究调试器工作原理的文章的第一篇.我还不确定这个系列需要包括多少篇文章以及它们所涵盖的主题,但我打算从基础知识开始说起. 关于本文 我打算在这篇文章中介绍关 ...
- 视频教程-Linux系列课程(基础篇)-Linux
Linux系列课程(基础篇) 2年JavaEE开发 ,5年资深大数据开发大牛,曾就职于蓝点科技,擅长精准广告系统开发,精通Linux操作系统! 具备丰富的大数据研发和培训经验,熟练运用Hadoop和S ...
- nodejs missing script: dev_nodejs深入学习系列之v8基础篇
V8这个概念大家都不陌生了,那么你动手编译过V8源码吗?编译后有尝试去了解V8背后的一些概念吗?如果没有,那么也不用心慌,下文将跟大家一一解释这些东西.在编译V8之前我们先要了解一个东西-构建系统 1 ...
- proe输入数字时成双出现_职场数据控系列,超市基础篇,商品双ABC分析法及应用...
在上一篇文章中介绍了:商品ABC分析法,本篇文章中就对商品ABC分析后的又一拓展应用:双ABC分析及应用做基础介绍:请超市行业的同行朋友们指正,觉得有帮助的,恳请关注收藏,油条小编将持续更新零售超市相 ...
- iOS多线程系列之GCD栅栏(barrier)实现同步锁
多线程编程中很容易出现资源竞争的问题,比如异步读写操作造成数据不同步.那么解决这一问题多线程编程中提供了一种同步机制叫同步锁.iOS中实现同步锁机制的方案不止一种,这里主要介绍一下强大的GCD给出的方 ...
- java多线程系类:基础篇:10生产者消费者的问题
概要 本章,会对"生产/消费者问题"进行讨论.涉及到的内容包括: 1. 生产/消费者模型 2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/sk ...
最新文章
- SilverLight学习笔记--如何解决Button不响应MouseLeftButtonDown与MouseLeftButtonUp事件的问题...
- 【物联网】 AR9344开发环境的搭建和编译固件
- Android之调用系统分享
- Golang语言写99乘法表-双重for循环
- 数组排序(冒泡、排序)
- mysql如何导出sql文件_MYSQL导入导出.sql文件
- 洛谷OJ测评常见的错误
- 计算机网络视频信号怎么传,如何将摄像机视频信号通过NDI传输到Zoom会议软件...
- Cisco Packet Tracer路由器的基本命令
- 大一学生《web课程设计》用DIV+CSS技术设计的个人网页(网页制作课作业)
- 计算机网络密码凭据,win7系统共享提示输入网络凭据用户名密码的解决办法
- windows下命令行格式化U盘
- 51单片机-PWM调速(直流电机,智能小车的电机调速)
- ESD防护选型思路(二)
- PhotoShop cc合并多张静态图片为gif动画
- 【Linux】【Kernel】BUG: scheduling while atomic问题分析
- 为保证系统的可用性的事前事中事后
- Variable conv1/weights already exists, disallowed. Did you mean to set reuse=True...tensorflow报错
- 评估托管SDWAN服务
- 一些好用的Mac软件推荐