Swift - 多线程GCD详解
// GCD详解
// 目录:
// 1. 创建GCD队列(最常用)
// 2. 自定义创建队列
// 3. 使用多线程实现延迟加载
// 4. 使用多线程实现重复(循环)
// 5. 使用多线程来控制 多任务数据加载 和 UI 的显示的先后顺序
// 6. 暂停队列
// 7. 恢复队列
//
import UIKit
class ViewController: UIViewController {
@IBOutlet var myLable:UILabel?
@IBAction func clickButton(){
// 1. 创建GCD队列(最常用)
/* 第一个参数为队列优先级。有以下(优先级从上到下依次降低)
* - DISPATCH_QUEUE_PRIORITY_HIGH:
* - DISPATCH_QUEUE_PRIORITY_DEFAULT: 多用默认
* - DISPATCH_QUEUE_PRIORITY_LOW:
* - DISPATCH_QUEUE_PRIORITY_BACKGROUND:
* 第二个参数为预留参数,一般为0
*/
let myQueue:dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
// 用异步的方式运行队列里的任务
dispatch_async(myQueue, {
self.sendData1()
})
//--------------------------------分隔符------------------------------------>
// 2. 自定义创建队列
/*
第一个参数,是创建队列的一个标签
第二个参数,是创建队列的类型,有以下两种:
--> DISPATCH_QUEUE_SERIAL (串行队列)
--> DISPATCH_QUEUE_CONCURRENT (并行队列)
*/
let myQueue1:dispatch_queue_t = dispatch_queue_create("www.yunshow.com", DISPATCH_QUEUE_CONCURRENT)
// 用异步的方式运行队列里的任务
dispatch_async(myQueue1) { () -> Void in
self.sendData1()
}
//--------------------------------分隔符------------------------------------>
// 3. 使用多线程实现延迟加载
/*
第一个参数,表示从何时开始,DISPATCH_TIME_NOW 表示从现在开始
第二个参数,NSEC_PER_SEC 是用来将2秒时间转化为GCD的参数
*/
let myTime : dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW,(Int64)(NSEC_PER_SEC * 2))
dispatch_after(myTime, dispatch_get_main_queue()) { () -> Void in
self.sendData1()
}
//--------------------------------分隔符------------------------------------>
// 4. 使用多线程实现重复(循环)
/*
第一个参数, 表示循环的次数
*/
dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { (UIntindex) -> Void in
print(index)
}
}
func sendData(){
sleep(5)
}
func updateLable(){
myLable?.text = "数据发送成功"
}
func sendData1(){
sleep(5)
// 在主线程中更新UI
dispatch_async(dispatch_get_main_queue(), {
self.updateLable()
})
}
//--------------------------------分隔符------------------------------------>
// 5. 使用多线程来控制 多任务数据加载 和 UI 的显示的先后顺序
@IBOutlet var myImage1: UIImageView?
@IBOutlet var myImage2: UIImageView?
@IBOutlet var myLable1: UILabel?
@IBAction func clickSend(){
// 创建自定义调度组
let myGroup = dispatch_group_create()
// 使用调度组的异步方法将第一个任务放入
dispatch_group_async(myGroup, dispatch_get_main_queue()) { () -> Void in
// 从网络中加载图片1 的数据
let myDate = NSData(contentsOfURL: NSURL(string: "")!)
// UIImageView 更新加载好的图片,UI更新应该放在主线程中异步加载
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.myImage1?.image = UIImage(data: myDate!)
})
}
// 使用调度组的异步方法将第二个任务放入
dispatch_group_async(myGroup, dispatch_get_main_queue()) { () -> Void in
// 从网络中加载图片2 的数据
let myDate1 = NSData(contentsOfURL: NSURL(string: "")!)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.myImage2?.image = UIImage(data: myDate1!)
})
}
// notify(异步) 等待通知,即等待组内的任务都完成手再执行这个线程的任务
// wait (同步,会阻塞线程) 也是等待通知
// 注意: 在更新数据库操作时候,多使用 wait,其他时间多使用 notify
dispatch_group_notify(myGroup, dispatch_get_main_queue()) { () -> Void in
// 在两张图片都加载完毕时,在lable中显示“加载完毕”
self.myLable1?.text = "加载完毕"
}
dispatch_group_wait(myGroup, DISPATCH_TIME_FOREVER)
self.myLable1?.text = "加载完毕"
}
//--------------------------------分隔符------------------------------------>
let myQueue: dispatch_queue_t = dispatch_queue_create("www.yunshow.com", DISPATCH_QUEUE_CONCURRENT)
@IBAction func clickSuspend(){
// 6. 暂停队列 (注意:只能暂停自定义队列,不能暂停主队列和系统队列)
dispatch_suspend(myQueue)
}
@IBAction func clickResume(){
// 7. 恢复队列 (注意:对已经暂停的队列才能恢复)
dispatch_resume(myQueue)
}
override func viewDidLoad()
{
super.viewDidLoad()
}
override func didReceiveMemoryWarning()
{
super.didReceiveMemoryWarning()
}
}
PS:苹果官网API - Dispatch
转载于:https://www.cnblogs.com/gongyuhonglou/p/10311537.html
Swift - 多线程GCD详解相关推荐
- IOS 多线程04-GCD详解 底层并发 API
IOS 多线程04-GCD详解 底层并发 API 注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大 ...
- java线程的cancel_多线程-Cancel详解
多线程-Cancel详解 在取消一个对等线程的请求被同意时,会有一个取消过程同pthread_cancel( )的返回异步发生. 目标线程的取消类型和取消状态决定了取消何时真正发生.可取消性状态描述了 ...
- java多线程设计模式详解[推荐]
java多线程设计模式详解[推荐] java多线程设计模式详解之一 线程的创建和启动 java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run ...
- [原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(一)
本文可任意转载,但必须注明作者和出处. [原创]手把手教你Linux下的多线程设计(一) --Linux下多线程编程详解 原 ...
- 多线程锁详解之【临界区】
更多的锁介绍可以先看看这篇文章:多线程锁详解之[序章] 正文: 一般锁的类型可分为两种:用户态锁和内核态锁.用户态锁是指这个锁的不能够跨进程使用.而内核态锁就是指能够跨进程使用的锁.一般书中会说,wi ...
- 多线程——synchronized详解
多线程--synchronized详解 "当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下 的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用 ...
- Java多线程进阶详解
文章目录 1.卖票案例引入数据不安全问题 2.同步代码块 深入理解synchronized关键字 3.同步方法与静态同步方法 同步方法 静态同步方法 内置锁 静态同步方法与同步代码块共同使用 为什么要 ...
- swift 多线程GCD和延时调用
GCD 是一种非常方便的使用多线程的方式.通过使用 GCD,我们可以在确保尽量简单的语法的前提下进行灵活的多线程编程.在 "复杂必死" 的多线程编程中,保持简单就是避免错误的金科玉 ...
- ios swift版 sqlite3详解
iOS中的SQLite3的封装与详细应用 SQLite是一个开源的嵌入式关系数据库,特点是易使用.高效.安全可靠.可移植性强. iOS中的本地持久化存储 NSUserDefault:一般用于存储小规模 ...
最新文章
- php的foreach循环执行过程分析以及循环中执行unset()的一些问题
- Python 缓冲区
- SpringDataJpa开发--继承JpaRepository实现简单条件查询
- C# 类构造函数赋值里属性与字段赋值注意项
- python3远程连接_Python3 SSH远程连接服务器的方法示例
- 甘特图 知乎_APS生产排程软件基础知识-计划甘特图
- NotificationManager滑动不退出_退出支付宝的相互宝大病互助计划居然需要8个步骤!...
- Access control allow origin 简单请求和复杂请求
- 博客中GIF动画超简单制作
- 微信小程序区分开发版、体验版和正式版
- matlab egarch,EGARCH模型参数的拟蒙特卡洛估计方法及其在股票指数上的应用
- 开展网络口碑营销的前提
- 设置微信自动回复,默认回复及推送模板消息
- 某IE订位源码分享与交流
- python编写的储存单位转换代码(以字节(B)为单位)
- 【饭谈】为什么有的同事那么菜但工资比自己高?
- 崔培升:亿赛通目标盯紧 做中国数据安全防护的专家
- Android的壁纸放在哪?
- 20145339顿珠达杰 《信息安全系统设计基础》第0周学习总结
- 用商城维护类项目,讲下应届生如何在面试中介绍项目,如何准备面试
热门文章
- 一根29cm长的尺子,只允许在它上面刻7个刻度。
- Fedora下网络配置及相关命令
- AI专家Marcus质疑深度学习:面临十大挑战(含参考文献)
- 【OpenCV入门指南】第五篇轮廓检测 下
- html做旋转的五角星,如何用几何画板制作旋转的五角星
- java atomicfloat_Java:有没有AtomicFloat或AtomicDouble?
- html实现静态下来菜单js,JS代码实现静态导航菜单效果要用何主要代码?
- 024_Jedis连接池
- ffmpeg-win32-v3.2.4 下载_iTools下载|iTools 4.4.3.4 官方中文版
- html怎么去掉背景颜色,word背景颜色怎么去掉