Swift - 多线程GCD详解

Posted 公羽寒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Swift - 多线程GCD详解的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 多线程实现方式 - Grand Central Dispatch(GCD)

iOS多线程方案总结及使用详解

GCD多线程在swift中的变化

Swift - GCD 可变数组多线程发出“在枚举时发生突变”

IOS - 总结下swift使用GCD 多线程GCD和DispatchQueue

Swift系列三十一 - 多线程