您的位置:首页 > 移动开发 > Swift

Swift - 多线程GCD详解

2017-05-31 09:42 441 查看
 
//  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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: