swift__多线程GCD详解

前端之家收集整理的这篇文章主要介绍了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()

}

@H_218_301@ // 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()

}

}

原文链接:https://www.f2er.com/swift/324887.html

猜你在找的Swift相关文章