原创Blog,转载请注明出处

本文阅读的过程中,如有概念不懂,请參照前专栏中之前的文章,假设还有疑惑,请留言。

这是我关于GCD专栏的地址

http://blog.csdn.net/column/details/swift-gcd.html

本教涵盖的内容

一、dispatch_after

二、dispatch_apply 

三、dispatch_once



一、dispatch_after

功能:延迟一段时间把一项任务提交到队列中运行,返回之后就不能取消

经常使用来在在主队列上延迟运行一项任务

函数原型

func dispatch_after(_ when: dispatch_time_t,
_ queue: dispatch_queue_t!,
_ block: dispatch_block_t!)

參数

        when	过了多久运行的时间间隔
queue 提交到的队列
block 运行的任务

比如:能够利用dispatch_after写一个自己用的Delay函数,delay一段时间在主线程上运行一段代码

func hwcDelay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}

仅仅须要这样使用

hwcDelay(0.5){

//Do everything you want

}

比方,当用户的应用不满足某些我们App须要的条件时候(比如,我们的App须要蓝牙打开),然后在APP启动的时候測到蓝牙Off后,应当给用户一个提示。在view加载完毕后,延迟给用户一个提示,也能够给这个提示加入一些动画,要比view在加载完毕直接显示提示要有好的多。

举例

在viewLoad后,延迟1s,提示一个alertview

class ViewController: UIViewController{
func hwcDelay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
override func viewDidLoad(){
super.viewDidLoad()
hwcDelay(1.0){
var alertview = UIAlertView(title:"Dispatch_after",message:"Message",delegate:self,cancelButtonTitle:"OK")
alertview.show()
}
}
override func didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()
}
}

二、dispatch_apply

功能:把一项任务提交到队列中多次运行,详细是并行运行还是串行运行由队列本身决定.注意,dispatch_apply不会立马返回,在运行完成后才会返回,是同步的调用。

func dispatch_apply(_ iterations: UInt,
_ queue: dispatch_queue_t!,
_ block: ((UInt) -> Void)!)

參数

iterations	运行的次数
queue 提交到的队列
block 运行的任务

那么,何时使用这个函数呢?从它的功能不难看出,假设我们能够把不相关的循环提交到后台线程并行运行,而且循环任务调度到后台运行的效率提高,能抵消掉队列调度本身的开销,那么效率会显著提高。



举例

比方我有一个数组,存储了一系列对象,初始化的时候,这些对象都要调用一次某函数来进行相关的计算。这些计算相互没有影响。这时,我们就能够用dispatch_apply来使用异步队列来初始化.这里把这样的情况进行简化

class ViewController: UIViewController{
var hwcarray = ["hello","hwc","hellohwc"]
override func viewDidLoad(){
super.viewDidLoad()
dispatch_apply(3,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)){
(index:UInt) -> () in
var expObject = self.hwcarray[Int(index)] as NSString
NSLog("%d",expObject.length)
}
NSLog("Dispatch_after is over")
}
override func didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()
}
}

能够看到,输出是

3
5
8
dispatch_after is over

因为这样会堵塞主线程,而下文又与dispatch_apply的运行结果无关,所以能够在异步队列中掉dispatch_apply,然后运行完毕后进行通知

class ViewController: UIViewController{
var hwcarray = ["hello","hwc","hellohwc"]
override func viewDidLoad(){
super.viewDidLoad()
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)){
dispatch_apply(3,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)){
(index:UInt) -> () in
var expObject = self.hwcarray[Int(index)] as NSString
NSLog("%d",expObject.length)
}
NSLog("Dispatch_after in global queue is over")
} NSLog("Dispatch_after in main queue is over")
}
override func didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()
}
}

这样输出为

8
Dispatch_after in main queue is over
3
5
Dispatch_after in global queue is over

能够看到,相对主队列(主线程)是异步的,在global队列中是并行运行的

三、dispatch_once

功能:保证在APP执行期间,block中的代码仅仅执行一次

func dispatch_once(_ predicate: UnsafeMutablePointer<dispatch_once_t>,

                 _ block: dispatch_block_t!)

參数

predicate
用来推断提交的block是否运行完毕

block 运行一次的任务

dispatch_once的经典有用场景是单例

单例代码:

class hwcSingleton {
var testVariable:Int!
func print(){
testVariable = testVariable + 1
println(testVariable)
}
class var sharedObject: hwcSingleton {
struct StaticStruct {
static var predicate : dispatch_once_t = 0
static var instance : hwcSingleton? = nil
}
dispatch_once(&StaticStruct.predicate) {
StaticStruct.instance = hwcSingleton()
StaticStruct.instance?.testVariable = 10
}
return StaticStruct.instance!
}
}

当然也能够在多线程环境下,保证一段代码仅仅运行一次。

完整具体解释GCD系列(二)dispatch_after;dispatch_apply;dispatch_once的更多相关文章

  1. 完整详解GCD系列(三)dispatch_group

    http://blog.csdn.net/hello_hwc/article/details/41409135 一.dispatch_group把一组任务提交到队列中,这些队列可以不相关,然后坚挺这组 ...

  2. [知识库分享系列] 二、.NET(ASP.NET)

    最近时间又有了新的想法,当我用新的眼光在整理一些很老的知识库时,发现很多东西都已经过时,或者是很基础很零碎的知识点.如果分享出去大家不看倒好,更担心的是会误人子弟,但为了保证此系列的完整,还是选择分享 ...

  3. sed修炼系列(二):sed武功心法(info sed翻译+注解)

    sed系列文章: sed修炼系列(一):花拳绣腿之入门篇sed修炼系列(二):武功心法(info sed翻译+注解)sed修炼系列(三):sed高级应用之实现窗口滑动技术sed修炼系列(四):sed中 ...

  4. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  5. 一生挚友redo log、binlog《死磕MySQL系列 二》

    系列文章 原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 一生挚友redo log.binlog<死磕MySQL系列 二> 前言 咔咔闲谈 上期根据 ...

  6. highcharts 结合phantomjs纯后台生成图片系列二之php2

    上篇文章中介绍了phantomjs的使用场景,方法. 本篇文章详细介绍使用php,highcharts 结合phantomjs纯后台生成图片.包含一步步详细的php代码 一.highcharts 结合 ...

  7. 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换

    http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...

  8. SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础

    原文:SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础 在前一篇博文中我们学习到了一些关于地理信息的基础知识,也学习了空间参照系统,既地球椭球体.基准.本初 ...

  9. Wireshark入门与进阶系列(二)

    摘自http://blog.csdn.net/howeverpf/article/details/40743705 Wireshark入门与进阶系列(二) “君子生非异也,善假于物也”---荀子 本文 ...

随机推荐

  1. Apple Watch 1.0 开发介绍 1.4 简介 使用iOS技术

    WatchKit extension可以使用iOS app同样的技术,但是由于他是extension,使用有些技术的时候会有限制,有些不推荐使用.下面是一些介绍以及什么时候使用什么技术: 有些需要权限 ...

  2. TCP/IP 网络精讲:OSI七层模型(第二课)

    内容简介 1.前言 2.第一部分第二课:互联网的创立,OSI七层模型 3.第一部分第三课预告:OSI第一层,连接你的机器 前言 PS:昨天做了课程大纲之后,发现这个坑挖得有点大.不过既然挖了,岂有不跳 ...

  3. 开源Math.NET基础数学类库使用(04)C#解析Matrix Marke数据格式

    原文:[原创]开源Math.NET基础数学类库使用(04)C#解析Matrix Marke数据格式 开源Math.NET基础数学类库使用系列文章总目录:   1.开源.NET基础数学计算组件Math. ...

  4. Visual Studio 使用及调试必知必会

    原文:Visual Studio 使用及调试必知必会   一:C# CODING 技巧 1:TODO 然后 CTRL + W + T,打开任务列表,选中 Comments,就会显示所有待做的任务 2: ...

  5. uml学习书籍

     uml真正实用的书5这是足够.学习如以下的处理: <UML distilled><--><UML和模式应用>-><UML用户指南> 附加两本&l ...

  6. JS基础——函数的创建和使用

    在JS中函数在使用时实质上和我们平时学习的编程语言中的函数类似,它相同也具有函数名,參数,返回值,函数体等这些寻常函数所具有的内容.可是作为一种脚本语言,它确实也有自己不一样的地方. 一.创建 < ...

  7. 嵌入在网页上Flash媒体播放器(1)

    做的项目,在不久的将来相关的Flash玩家使用,需要播放视频的网页上,不同的视频资源,需要不同的球员.基于使用稳定性.的嵌入式和嵌入式复杂性能的优点概括起来有两种方式(不同的玩家),视频资源也略有不同 ...

  8. Cocos2d-x 3.0final 终结者系列教程04-引擎架构分析

    从前,有一个跟我来Android学生,总是问我: 沉老师,为什么Android的形式被称为Activity,为什么要onCreate方法写setContentView(R.layout.main)? ...

  9. 根据自己的需要,把别人开发好的东西搬过来,优化and重构,在优化的过程中,甚至也会弄出一套全新的东西(转)

    赵海平在今年三月份来到阿里,听毕玄(他现任主管)说去年五六月份就跟赵海平聊上了.有人问:为啥 BAT 三大巨头,你看中了阿里巴巴?在今天现场达一千多人的分享中赵海平给出了回复:“因为百度和腾讯没找我呗 ...

  10. HDU 4085 Steiner树模板称号

    Dig The Wells Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...