博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发:Swift多线程GCD的使用
阅读量:6352 次
发布时间:2019-06-22

本文共 2730 字,大约阅读时间需要 9 分钟。

  除了上一篇文章说到到,还有一个GCD(Grand Central Dispath),是Apple新开发的一个解决多核编程的解决方案,充分的利用CPU资源,将所有的任务,放到一个任务队列进行调度。 GCD 默认提供了全局的并发队列,供整个应用使用,不需要创建。

  • 同步和异步的区别
    • dispatch_sync 同步:不具备开启线程的能力
    • dispatch_async 异步 :具备开启线程的能力
  •  任务的执行方式
    • 并发队列:多个任务同时执行,并发只能在一步函数下才执行异步“
    • 串行队列:让任务一个接一个的运行

注意:一般在实际开发中最常用的是 dispatch_async 。

下面介绍几种常用的队列使用

一:最最常用的全局并发队列:

      //获取全局并发队列        let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)        //将任务添加到队列中 并发执行        dispatch_async(queue) { () -> Void in            //doSomething...任务1        }        dispatch_async(queue) { () -> Void in            //doSomething...任务2        }        dispatch_async(queue) { () -> Void in            //doSomething...任务3        }                //暂停一个队列        dispatch_suspend(queue)        //继续队列        dispatch_resume(queue)

 

二:串行队列,队列中的任务不会并发执行,会一个任务执行完成后再执行另外一个任务

//创建串行队列        let serialQueue = dispatch_queue_create("dispatch_queue_name", nil)        //将任务添加到队列中 一个任务执行完成后再执行另一个任务        dispatch_async(serialQueue) { () -> Void in            //doSomething... 任务1        }        dispatch_async(serialQueue) { () -> Void in            //doSomething... 任务2        }        dispatch_async(serialQueue) { () -> Void in            //doSomething... 任务3        }

 

三:GCD线程间的通信,通常用于子线程请求完数据,回到主线程更新UI

//线程间通信     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in            // 在子线程做一些事情            dispatch_async(dispatch_get_main_queue(), { () -> Void in                //在主线程更新UI...            })        }

 

四:线程延时执行

    //线程延时执行        let second:Double = 3.0        let dtime = dispatch_time(DISPATCH_TIME_NOW, Int64(second * Double(NSEC_PER_SEC)))                //3s后回到主线程中执行任务        dispatch_after(dtime, dispatch_get_main_queue()) { () -> Void in                    }        //3s后会开启一个新的线程执行队列中的任务        dispatch_after(dtime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in                    }

 

五:一次性代码,顾名思义,在应用生命周期内,block里代码块只会执行一次。

    var once:dispatch_once_t = 0        dispatch_once(&once, { () -> Void in            //在应用生命周期内只执行一次        })

 

六:队列组:将一些任务放进一个队列组,当所有任务执行完成后,会执行组的notify。

    /**********************************队列组******************************************/        let group = dispatch_group_create()        let groupQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)         dispatch_group_async(group, groupQueue){ () -> Void in            //任务1        }        dispatch_group_async(group, groupQueue){ () -> Void in            //任务2        }        dispatch_group_async(group, groupQueue){ () -> Void in            //任务3        }        dispatch_group_notify(group, groupQueue) { () -> Void in            // 会等任务1、任务2、任务3执行完毕后执行        }

 

 

完!

 

 

 

 

 

 

 

转载地址:http://acmla.baihongyu.com/

你可能感兴趣的文章
CollapsingToolbarLayoutDemo【可折叠式标题栏,顺便带有CardView卡片式布局】
查看>>
CentOS7.4安装配置mysql5.7 TAR免安装版
查看>>
解决IE二级链接无法打开故障
查看>>
Windows phone应用开发[16]-数据加密
查看>>
SQL Server 迁移数据到MySQL
查看>>
通用数据压缩算法简介
查看>>
The next Industry Standard in IT Monitoring, a python implementation Nagios like tool --- Shinken
查看>>
(笔记)找工作,该怎么进补
查看>>
div的显示和隐藏以及点击图标的更改
查看>>
(轉貼) Ubuntu將在ARM平台netbook上現身 (SOC) (News) (Linux) (Ubuntu)
查看>>
SQL注入测试工具:Pangolin(穿山甲)
查看>>
在html 的img属性里只显示图片的部分区域(矩形,给出开始点和结束点),其他部份不显示,也不要拉伸...
查看>>
程序员第二定律:量化管理在程序员身上永无可能
查看>>
ubuntu一些脚本的执行顺序
查看>>
类继承的结构
查看>>
Intel 被 ARM 逼急了
查看>>
testng + reportng 测试结果邮件发送
查看>>
百度亮相iDASH,推动隐私保护在人类基因组分析领域的应用
查看>>
Python「八宗罪」
查看>>
你的隐私还安全吗?社交网络中浏览历史的去匿名化
查看>>