微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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!)

})

}

// 使用调度组的异步方法将第二个任务放入

// 从网络中加载图片2 的数据

let myDate1 = NSData(contentsOfURL: NSURL(string: "")!)

ottom:0px; font-size:18px; line-height:normal; font-family:Menlo; color:rgb(61,{ () -> 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()

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐