加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift__多线程GCD详解

发布时间:2020-12-14 01:28:02 所属栏目:百科 来源:网络整理
导读:// GCD 详解 // 目录: // 1. 创建 GCD 队列 ( 最常用 ) // 2. 自定义创建队列 // 3. 使用多线程实现延迟加载 // 4. 使用多线程实现重复(循环) // 5. 使用多线程来控制 多任务数据加载 和 UI 的显示的先后顺序 // 6. 暂停队列 // 7. 恢复队列 // import UI

// 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: "")!)

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

}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读