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

时间: 2024-12-05 03:40:39

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

iOS多线程GCD详解

今天我们在这里了解一下GCD 1.什么是GCD? GCD全称Grand Central Dispatch,我们通俗的翻译叫牛逼的中心调度. 2.我们用GCD干什么? 通过 GCD,开发者不用再直接跟线程打交道了,只需要向队列中添加代码块即可,GCD 在后端管理着一个线程池.GCD 不仅决定着你的代码块将在哪个线程被执行,它还根据可用的系统资源对这些线程进行管理.这样可以将开发者从线程管理的工作中解放出来,通过集中的管理线程,来缓解大量线程被创建的问题. GCD 带来的另一个重要改变是,作为开发者

Swift基本运算符详解

运算符是检查,改变,合并值的特殊符号或短语.例如,加号+将两个数相加(如let i = 1 + 2).复杂些的运行算例如逻辑与运算符&&(如if enteredDoorCode && passedRetinaScan),又或让 i 值加1的便捷运算符自增运算符++i等. Swift 支持大部分标准 C 语言的运算符,且改进许多特性来减少常规编码错误.如,赋值符(=)不返回值,以防止把想要判断相等运算符(==)的地方写成赋值符导致的错误.数值运算符(+,-,*,/,%等)会检

多线程分离-详解

多线程分离-详解 在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached). 一个可结合的线程能够被其他线程收回其资源和杀死:在被其他线程回收之前,它的存储器资源(如栈)是不释放的. 相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放. 线程的分离状态决定一个线程以什么样的方式来终止自己.在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束. 只有当pthread_join()函数返回时,创建的线程才算终止

Java多线程编程详解

线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synch

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

Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AFNetworking非常稳定,在Mac OSX与iOS中也能像其他Objective-C代码一样用Swift编写.不过Alamofire更适合Swift语言风格习惯(Alamofire与AFNetworking可以共存一个项目中,互不影响). Alamofire 取名来源于Alamo Fire fl

mysql5.6 基于GTID及多线程复制详解

一 GTID 详解 官方文档:http://dev.mysql.com/doc/refman/5.6/en/replication-gtids.html在这篇文档里,我们可以知道全局事务 ID 的官方定义是:GTID = source_id:transaction_id MySQL 5.6 中,每一个 GTID 代表一个数据库事务.在上面的定义中,source_id 表示执行事务的主库 uuid(server_uuid),transaction_id 是一个从 1 开始的自增计数,表示在这个主库

C++11多线程——lock详解

C++11提供了两种管理锁的类 std::lock_guard:与mutex RAII相关,方便线程对互斥量上锁 std::unique_lock:   与mutex RAII相关,方便线程对互斥量上锁,相比std::lock_guard提供了更好的上锁和解锁控制 一 lock_guard详解 lock_guard是一个模板类:template<classMutex>class lock_guard; lock_guard对象通常用来管理某个锁(Lock)对象,与Mutex RALL相关,方便

iOS开发 多线程-转自MJ的GCD详解

一.简介 在iOS所有实现多线程的方案中,GCD应该是最有魅力的,因为GCD本身是苹果公司为多核的并行运算提出的解决方案.GCD在工作时会自动利用更多的处理器核心,以充分利用更强大的机器.GCD是Grand Central Dispatch的简称,它是基于C语言的.如果使用GCD,完全由系统管理线程,我们不需要编写线程代码.只需定义想要执行的任务,然后添加到适当的调度队列(dispatch queue).GCD会负责创建线程和调度你的任务,系统直接提供线程管理 二.调度队列(dispath qu

iOS GCD 详解

一.介绍 1.什么是GCD?Grand Central Dispatch,是苹果公司开发的一套多核编程的底层API.GCD首次发布在Mac OS X 10.6,iOS4及以上也可用.GCD存在于libdispatch.dylib这个库中,iOS程序默认动态加载这个库,无需手动引入.2.GCD工作原理让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务.一个任务可以是一个Function或是一个block.GCD的底层依然是用线程实现,不过这样可以让程序员不用关注