//  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详解相关推荐

  1. IOS 多线程04-GCD详解 底层并发 API

    IOS 多线程04-GCD详解 底层并发 API 注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大 ...

  2. java线程的cancel_多线程-Cancel详解

    多线程-Cancel详解 在取消一个对等线程的请求被同意时,会有一个取消过程同pthread_cancel( )的返回异步发生. 目标线程的取消类型和取消状态决定了取消何时真正发生.可取消性状态描述了 ...

  3. java多线程设计模式详解[推荐]

    java多线程设计模式详解[推荐] java多线程设计模式详解之一 线程的创建和启动 java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run ...

  4. [原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(一)

    本文可任意转载,但必须注明作者和出处. [原创]手把手教你Linux下的多线程设计(一)                                       --Linux下多线程编程详解 原 ...

  5. 多线程锁详解之【临界区】

    更多的锁介绍可以先看看这篇文章:多线程锁详解之[序章] 正文: 一般锁的类型可分为两种:用户态锁和内核态锁.用户态锁是指这个锁的不能够跨进程使用.而内核态锁就是指能够跨进程使用的锁.一般书中会说,wi ...

  6. 多线程——synchronized详解

    多线程--synchronized详解 "当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下 的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用 ...

  7. Java多线程进阶详解

    文章目录 1.卖票案例引入数据不安全问题 2.同步代码块 深入理解synchronized关键字 3.同步方法与静态同步方法 同步方法 静态同步方法 内置锁 静态同步方法与同步代码块共同使用 为什么要 ...

  8. swift 多线程GCD和延时调用

    GCD 是一种非常方便的使用多线程的方式.通过使用 GCD,我们可以在确保尽量简单的语法的前提下进行灵活的多线程编程.在 "复杂必死" 的多线程编程中,保持简单就是避免错误的金科玉 ...

  9. ios swift版 sqlite3详解

    iOS中的SQLite3的封装与详细应用 SQLite是一个开源的嵌入式关系数据库,特点是易使用.高效.安全可靠.可移植性强. iOS中的本地持久化存储 NSUserDefault:一般用于存储小规模 ...

最新文章

  1. php的foreach循环执行过程分析以及循环中执行unset()的一些问题
  2. Python 缓冲区
  3. SpringDataJpa开发--继承JpaRepository实现简单条件查询
  4. C# 类构造函数赋值里属性与字段赋值注意项
  5. python3远程连接_Python3 SSH远程连接服务器的方法示例
  6. 甘特图 知乎_APS生产排程软件基础知识-计划甘特图
  7. NotificationManager滑动不退出_退出支付宝的相互宝大病互助计划居然需要8个步骤!...
  8. Access control allow origin 简单请求和复杂请求
  9. 博客中GIF动画超简单制作
  10. 微信小程序区分开发版、体验版和正式版
  11. matlab egarch,EGARCH模型参数的拟蒙特卡洛估计方法及其在股票指数上的应用
  12. 开展网络口碑营销的前提
  13. 设置微信自动回复,默认回复及推送模板消息
  14. 某IE订位源码分享与交流
  15. python编写的储存单位转换代码(以字节(B)为单位)
  16. 【饭谈】为什么有的同事那么菜但工资比自己高?
  17. 崔培升:亿赛通目标盯紧 做中国数据安全防护的专家
  18. Android的壁纸放在哪?
  19. 20145339顿珠达杰 《信息安全系统设计基础》第0周学习总结
  20. 用商城维护类项目,讲下应届生如何在面试中介绍项目,如何准备面试

热门文章

  1. 一根29cm长的尺子,只允许在它上面刻7个刻度。
  2. Fedora下网络配置及相关命令
  3. AI专家Marcus质疑深度学习:面临十大挑战(含参考文献)
  4. 【OpenCV入门指南】第五篇轮廓检测 下
  5. html做旋转的五角星,如何用几何画板制作旋转的五角星
  6. java atomicfloat_Java:有没有AtomicFloat或AtomicDouble?
  7. html实现静态下来菜单js,JS代码实现静态导航菜单效果要用何主要代码?
  8. 024_Jedis连接池
  9. ffmpeg-win32-v3.2.4 下载_iTools下载|iTools 4.4.3.4 官方中文版
  10. html怎么去掉背景颜色,word背景颜色怎么去掉