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
Swift - 多线程GCD详解的更多相关文章
- iOS多线程GCD详解
在这之前,一直有个疑问就是:gcd的系统管理多线程的概念,如果你看到gcd管理多线程你肯定也有这样的疑问,就是:并发队列怎么回事,即是队列(先进先出)怎么会并发,本人郁闷了好久,才发现其实cgd管理多 ...
- .NET多线程同步方法详解
.NET多线程同步方法详解(一):自由锁(InterLocked) .NET多线程同步方法详解(二):互斥锁(lock) NET多线程同步方法详解(三):读写锁(ReadWriteLock) .NET ...
- Java多线程——多线程方法详解
本系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线程的深入剖 ...
- iOS开发——网络编程Swift篇&Alamofire详解
Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AF ...
- Swift - 可选类型详解
可选类型详解 直接上代码解释 // 类中所有的属性在对象初始化时,必须有初始化值 class Person : NSObject { var name : String? var view : UIV ...
- Java多线程超级详解(只看这篇就够了)
多线程能够提升程序性能,也属于高薪必能核心技术栈,本篇会全面详解Java多线程.@mikechen 主要包含如下几点: 基本概念 很多人都对其中的一些概念不够明确,如同步.并发等等,让我们先建立一个数 ...
- IOS 多线程05-OperationQueue 、GCD详解
注:本人是翻译过来,并且加上本人的一点见解. 1. 开始 目前在 iOS中有两套先进的同步 API 可供我们使用:操作队列OperationQueue和 GCD .其中 GCD 是基于 C 的底层 ...
- iOS多线程(上)——GCD详解(上)
GCD(Grand central Dispatch)是Apple开发的一个多核编程的较新的解决方法.它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统.下面我讲讲述关于GCD的点,通篇读完 ...
- GCD详解
什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像 NSOperationQueue,他们都允 ...
随机推荐
- HTTP API 设计指南(基础部分)
前言 这篇指南介绍描述了 HTTP+JSON API 的一种设计模式,最初摘录整理自 Heroku 平台的 API 设计指引 Heroku 平台 API 指引. 这篇指南除了详细介绍现有的 API 外 ...
- C++对析构函数的误解
C++析构前言 析构函数在什么时候会自动被调用,在什么时候需要手动来调用,真不好意思说偶学过C++…今日特此拨乱反正. C++析构误解正文 对象在构造的时候系统会分配内存资源,对一些数据成员进行初始化 ...
- JVM内存模型 小小结
可以看一下我的另一篇总结 JVM运行时数据区与JVM堆内存模型小结 推荐一篇文章,尚学堂的 Java内存模型深度解读 . 不方便全文转载,就摘录下吧. 以往的认知都是以基本类型.引用类型.常量.方法等 ...
- C struct的内存对齐
说明:如果你看到了这篇,请略过. struct是复合类型. 其中的成员在内存中的分布都是对齐的. 这个对齐的意思是,struct的sizeof运算结果必定是其最大类型长度的整数倍. --注意,如果st ...
- (转)使用AfxGetMainWnd函数的一个心得
作者:朱金灿 来源:http://blog.csdn.net/clever101/ 使用AfxGetMainWnd函数获取MFC程序中的主框架类指针是一个常用作法.但是你会发现这一做法有时也会失灵.不 ...
- asp.net 后端验证
using EntryRegistration.Filters; using EntryRegistration.Models.Entity; using System; using System.C ...
- Android Intent 教程
原文:Android: Intents Tutorial 作者:Darryl Bayliss 译者:kmyhy 人不会漫无目的地瞎逛,他们所做的大部分事情--比方看电视.购物.编写下一个杀手级 app ...
- Unity3D使用经验总结 编辑器扩展篇【转】
一个引擎,最重要的就是工具,工具除了提升开发速度,提供可视化操作环境以外,还带了容错功能. 它使得大家的工作局限在一定的范围内,比如一个变量的配置,或者是一些类型的选择. 使用编辑器,使得既使不太明白 ...
- Socket网络编程精华篇
几个和Socket编程紧密相关的概念: TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本相同的系统级TCP/IP应用以及应 ...
- 而桌面app向来是web前端开发开发人员下意识的避开方
web前端语言的发展有目共睹, 从原来的pc web, 到后来的mobile SAP, 再到 nodejs,全站工程师应运而生. js快速而且稳健的发展让人不得不重视, 相应的前端开发人员的地位也越来 ...