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: "")!)
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() } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |