//  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

Swift - 多线程GCD详解的更多相关文章

  1. iOS多线程GCD详解

    在这之前,一直有个疑问就是:gcd的系统管理多线程的概念,如果你看到gcd管理多线程你肯定也有这样的疑问,就是:并发队列怎么回事,即是队列(先进先出)怎么会并发,本人郁闷了好久,才发现其实cgd管理多 ...

  2. .NET多线程同步方法详解

    .NET多线程同步方法详解(一):自由锁(InterLocked) .NET多线程同步方法详解(二):互斥锁(lock) NET多线程同步方法详解(三):读写锁(ReadWriteLock) .NET ...

  3. Java多线程——多线程方法详解

    本系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线程的深入剖 ...

  4. iOS开发——网络编程Swift篇&Alamofire详解

    Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AF ...

  5. Swift - 可选类型详解

    可选类型详解 直接上代码解释 // 类中所有的属性在对象初始化时,必须有初始化值 class Person : NSObject { var name : String? var view : UIV ...

  6. Java多线程超级详解(只看这篇就够了)

    多线程能够提升程序性能,也属于高薪必能核心技术栈,本篇会全面详解Java多线程.@mikechen 主要包含如下几点: 基本概念 很多人都对其中的一些概念不够明确,如同步.并发等等,让我们先建立一个数 ...

  7. IOS 多线程05-OperationQueue 、GCD详解

      注:本人是翻译过来,并且加上本人的一点见解. 1. 开始 目前在 iOS中有两套先进的同步 API 可供我们使用:操作队列OperationQueue和 GCD .其中 GCD 是基于 C 的底层 ...

  8. iOS多线程(上)——GCD详解(上)

    GCD(Grand central Dispatch)是Apple开发的一个多核编程的较新的解决方法.它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统.下面我讲讲述关于GCD的点,通篇读完 ...

  9. GCD详解

    什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像 NSOperationQueue,他们都允 ...

随机推荐

  1. 上手并过渡到PHP7(4)——取代fatal error的engine exceptions

    上手并过渡到PHP7 取代fatal error的engine exceptions 泊学原文链接泊学代码秀视频 自从PHP 4以来,PHP的错误处理几乎就是一成不变的.只不过在PHP 5.0里添加了 ...

  2. imx6 spi分析

    /************************************************************************** *本文主要跟踪imx6 spi设备和驱动的注册过 ...

  3. C++ IO流小结

    撒花庆祝下,终于看完了(C++Primer)第一部分,即将进入第二部分! IO部分,最基本的是iostream(istream.ostream),子类有fstream(ifstream.ofstrea ...

  4. Resource接口,及资源

    Resource介绍 编码的时候,除了代码本身,我们还需要对外部的资源进行处理.例如:URL资源.URI资源.File资源.ClassPath相关资源.服务器相关资源(VFS等)等等. 而这些资源的处 ...

  5. CentOS 6.5安装KVM实践

    一,安装CentOS6.5,使用最小化的minimal安装二.安装完CentOS后,使用root登录配置网卡,使虚拟机可以使用外网上网 vi /etc/sysconifg/network-script ...

  6. 浅谈cookie测试

    Cookie 提供了一种在Web 应用程序中存储用户特定信息的方法,例如存储用户的上次 访问时间等信息.假如不进行cookie存储一个网站的用户行为,那么可能会造成以下问题:用户进行购买几件商品转到结 ...

  7. Oracle行列转换的思考与总结

    最近几天一直在弄Oracle-SQL的问题,涉及到了一些平时没有用到的东西,也因此而在这里郁闷了好久.现在问题得到了解决虽说不算完美.但是还是和大家一起分享一下. 行列转换之一:sum(case wh ...

  8. 【matlab】图像直方图

    使用imhist函数(要先用rgb2gray转化为灰度图像) 利用matlab计算图像直方图函数为imhist() 具体用法: imhist( i );直接显示图像i的灰度直方图: imhist(i, ...

  9. 移动HTML 5前端性能优化指南

    概述 PC优化手段在Mobile侧同样适用 在Mobile侧我们提出三秒种渲染完成首屏指标 基于第二点,首屏加载3秒完成或使用Loading 基于联通3G网络平均338KB/s(2.71Mb/s),所 ...

  10. 帝国留言板管理员回复发送EMAIL通知客户

    说明:修改1:e/admin/tool/ReGook.php   /*回复表单*/ 43行处添加代码 ------------------------------------------------- ...