zoukankan      html  css  js  c++  java
  • Swift

    //  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

  • 相关阅读:
    uniapp判断token多次登录问题
    vue强制刷新子组件到初始状态
    时间戳转化时间过滤器
    axios二次封装具有请求/响应拦截的http请求
    vue常见的工具函数
    解决npm i 初始化,core-js报错
    node环境变量配置
    scss基本使用
    Vue element-ui父组件控制子组件的表单校验
    antd-Calendar(日历)自动嵌入对应时间问题
  • 原文地址:https://www.cnblogs.com/gongyuhonglou/p/6518058.html
Copyright © 2011-2022 走看看