Grand Central Dispatch =GDC
1.有两种,顺序的serial Dispatch Queue 与 并发的Concurrent Dispatch Queue
前者是所有加入这个queue的block会顺序执行,完成一个在开始第二个。既此队列只开一个线程顺序执行。
后者是所有加入这个queue的block会并发执行,第二个的开始与第一个是否结束无关,他会选择最有解决线程创建方案,不会每个block创建一个线程(比如b1,b2,b3当要执行b3的时候,b1执行完了,此时b3会加入b1的线程而不会重新创建)。
2.创建方式
dispatch_queue_t xxx = dispatch_queue_create("queueName",Null) //这个是创建了serial Dispatch Queue
dispatch_queue_t xxx = dispatch_queue_create("queueName",DISPATCH_QUEUE_CONCURRENT);//这个是创建concurrent dispatch queue
需要人工release
3.Main Dispatch Queue/Global Dispatch Queue
Main Dispatch Queue 主线程队列 加入次线程的都会在主线程进行执行,既丢入NSRunLoop里。一般需要刷新页面相关的才会使用。
Global Dispatch Queue 是做一个快速获取的Concurrent dispatch queue存在的,他有4个优先级 background,low,default,high
注意:使用MainDQ 和 GlobalDQ 是不需要进行retain 或release的
4.dispatch_set_target_queue
设置队列优先级。
dispatch_set_target_queue(Q1,Q2);
Q1为需要修改优先级的,Q2为Q1要与他同级的。
MainDQ 与GlobalDQ因为是全局 所以无法作为第一个参数。
在必须将不可并行的处理追加到多个serial Dispatch Queue 中时,如果使用dispatch_set_target_queue函数将目标指定为某一个serialDispatchQueue即可防止处理并行执行。
5.dispatch_after 与 dispatch_walltime
dispatch_after 为延迟多久加入队列(相对时间)
dispatch_walltime 为在什么时间加入队列(绝对时间)
ex:
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,3ull * NSEC_PER_SEC);
dispatch_after(time,dispatch_get_main_queue(),^{…});
dispatch_time_t 是从第一个参数的时间开始,经历第二个参数的市场之后。
ull 是C语言数值字面量
NSEC_PER_SEC为秒为计数单位
NSEC_PER_MSEC为毫秒的计数单位
dispatch_walltime 返回的为dispatch_time_t 书p155
*6.Disptach Group
将dispatch 加入group,并且设置执行group队列完后的执行代码。
ex:
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_DEFAULT,0);
dispatch_group_t group=disptach_group_create();
dispatch_group_async(group,queue,^{1...});
dispatch_group_async(group,queue,^{2...});
dispatch_group_async(group,queue,^{3...});
dispatch_group_notify(group,dispatch_get_main_queue(),^{结束后执行的});
dispatch_release(group);
注意:在dispatch_group_notify函数中不管指定怎么样的Dispatch Queue,属于Dispatch Group的处理在追加的block(上面例子的【结束后执行的】)时都已经结束。
另外还有dispatch_group_wait(group,DISPATCH_TIME_FOREVER);
这个表示 调用他的线程永远等待(因为第二个参数DISPATCH_TIME_FOREVER,如果是其他ex:disptach_time_t time=dispatch_time(DISPATCH_TIME_NOW,1ull*NSEC_PER_SEC);
dispatch_group_wait(group,time);
的话就是等待1秒)
long result=dispatch_group_wait(……);
返回值为long型
if(result==0){
// 等待时间结束后,group的全部处理执行结束
}else{
// 等待时间结束后,group的还有未完成的处理
}
正常情况下不适用dispatch_group_wait,而使用dispatch_group_notify(group,dispatch_get_main_queue(),^{结束后执行的});
可以更好的简化代码。
7.dispatch_barrier_async
为了规避Concurrent dispatch queue使用中的并发读取数据,数据竞争等问题。
使用dispatch_barrier_async
ex:
queue 为Concurrent dispatch queue
queue 其他处理1
queue 其他处理2
dispatch_barrier_async(queue,blk_for_writing)
queue 其他处理3
queue 其他处理4
其他处理1 2 执行完 才会执行dispatch_barrier_async,dispatch_barrier_async执行完才会执行 其他处理 3 4
如果其他处理都是数据库读操作 dispatch_barrier_async是数据库写操作,那么这样能保证 3 4 读取的数据是修改(写入)后的,数据保持正确。
8.dispatch_sync
同步执行,与dispatch_async相反。此方法不能将block加到,mainQueue中,会导致死锁。也不能给Serial Dispatch Queue增加block,也会导致死锁。
简单的说这个一般不用,用只用在Concurrent dispatch queue中。(其实一般不会用到)
9.dispatch_apply
重复执行block,x次。
ex: dispatch(10,queue,^{…block…});
NSlog(@“done");
重复执行block 10次,并且等待执行结束后才继续执行NSlog(@“done”)。
注意:dispatch_apply([array count],queue,^(size_t index){…block…});
size_t index代表数组下标,上面代码会将数组array的每个下表都丢入block中执行一次。
10.dispatch_suspend/dispatch_resume
dispatch_suspend 挂起已经追加的处理(未执行的处理暂不执行)
dispatch_resume 恢复已经追加的处理
11.Dispatch Semaphore
代码性排他,通过计数器来限制当前代码在执行过程中只能有限的线程数执行。
创建:dispatch_semaphore_t semaphore=dispatch_semaphore_create(1);
创建一个dispatch_semaphore_t 并且初始化计数为1;
等待(此代码后开始限制线程(排他),加锁,并且计数-1)。
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);
排他控制结束(解锁,并且计数+1)
disptach_semaphore_signal(semaphore);
12.Dispatch_once
保证在应用程序执行过程中只执行一次的指令。
static dispatch_once_t pred;s
dispatch_once(&pred, ^{……});
13.Dispatch I/O
通过使用Dispatch I/O可以并发读写数据,提高效率 p167
14.dispatch_queue 与 dispatch_source
是无法中断的,要么使用内部标志位。
而dispatch_source 并且可以设置回调的cancel block。
- 浏览: 426892 次
- 性别:
- 来自: 深圳/湛江
文章分类
最新评论
-
wangyudong:
很多API doc生成工具生成doc需要重度依赖代码里加注解的 ...
[ios]利用xcode自动生成项目文档 -
tiger1819:
有源码么,想学习
[android]仿360状态,类流量监控桌面浮动显示 -
119568242:
借我一双翅膀 写道大哥,求指教啊?
IOS 开发,调用打电话,发短信,打开网址 -
借我一双翅膀:
大哥,求指教啊
IOS 开发,调用打电话,发短信,打开网址 -
li247276297:
楼主 是不是要加个权限?
[android]仿360状态,类流量监控桌面浮动显示
发表评论
-
[转]使用CGContextDrawImage绘制图片上下颠倒
2014-08-03 23:39 8389转自:http://www.bennychen.cn/ta ... -
[ios]ios-Demo4脱衣服/刮奖app-专业
2014-07-31 21:38 3304普通版本完成的锯齿很严重但是Ios系统中仅CGContex ... -
[ios]ios脱衣服/刮奖app-简单版
2014-07-31 12:21 1309其实就是两张图片,然后第一张图片被手指划过的地方clear ... -
[ios]视差动画
2014-07-16 09:19 962http://www.teehanlax.com/blog/ ... -
[ios]label增加边距-既左右对齐
2014-07-09 01:23 3469http://www.cocoachina.com/bbs/ ... -
[ios] iOS 富文本类库RTLabel
2014-06-30 16:09 1664转自:http://blog.csdn.net/duxinf ... -
[ios]CA animationWIthKeyPath的一些思考
2014-05-13 19:05 2363使用CABasicAnimation的时候 总会遇到 an ... -
[ios]UIVIew的初始化执行方法
2014-04-03 14:56 1568根据你需要执行的动作, 这里有几个方法: -(id)init ... -
[ios]Gesture与scrollView分别实现图片触控
2014-04-02 21:53 1298ScrollView方法 - (void)viewDidL ... -
[ios]Gesture与scrollView分别实现图片触控
2014-04-02 21:53 1... -
[ios]block写法
2014-04-02 21:46 1070参考:http://www.cnblogs.co ... -
[ios]Block分离DataSource -ios升级日记2
2014-04-02 21:44 840根据:http://objccn.io/issue-1-1 ... -
[ios]快速打印
2014-04-02 16:04 620以前打印frame老是用fram.x.x这样 太慢。 其实 ... -
[ios]自定义圆形滑动条-ios升级日记1
2014-04-01 21:53 6679学习下自定义控件。从开源项目中挖了一个 理解模仿了一个 ... -
[ios]iOS7状态栏隐藏
2014-04-01 10:39 706在iOS7中 ,如果你还想用UIApplication ... -
OC简写
2014-03-31 19:43 1068简写 OC的语法一直被认为比较麻烦,绝大多数的 ... -
[ios]NSNotification
2014-01-09 17:48 1609这是一个观察者模式。 [[NSNotific ... -
[ios]注销键盘
2014-01-09 17:17 795[[UIApplication sharedApplica ... -
[ios] NSLocale 获取当前语言版本
2013-12-02 17:08 2674获取当前手机情况NSLocale 获取当前语言版本: ... -
[ios]多语言支持
2013-12-02 14:04 1178转自:http://blog.csdn.net/songro ...
相关推荐
在iOS开发中,Grand Central Dispatch(GCD)是Apple推出的一种多核处理器并行运算技术,用于优化应用程序的性能。GCD是基于C语言的,但可以无缝集成到Objective-C和Swift中。这个名为"IOS GCD-Program-master"的...
Objective-C 最初由 Brad Cox 和 Tom Love 在1980年代早期设计,后来由苹果公司采用并推广,成为 macOS 和 iOS 操作系统的主要开发语言之一。 Objective-C 的主要特点包括: 1. **面向对象**:Objective-C 支持...
在iOS开发中,Grand Central Dispatch (GCD) 是一个强大的多线程管理工具,它提供了一种高效的方式来调度和管理并发任务。其中,`dispatch_semaphore`(信号量)是GCD的一个重要特性,用于控制对共享资源的访问,...
全称:Grand Central Dispatch(GCD) 定义:GCD是苹果公司开发的一套多线程编程的API,用于简化多线程编程的复杂性。 功能:GCD提供了一个易于使用的、基于任务的并发模型,可以将任务提交给系统,系统会自动管理...
在iOS和macOS开发中,Grand Central Dispatch(GCD)是一种强大的多线程技术,用于管理应用程序的并发性。GCD是Apple的C语言库,它抽象了底层的线程和处理器细节,使得开发者可以更方便地利用多核处理器的优势。本...
GCD(Grand Central Dispatch),是一套低层API,提供了一种新的方法来进行并发程序编写。它允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。GCD比之NSOperationQueue更底层更高效,...
在iOS开发中,Grand Central Dispatch (GCD) 是一种强大的多线程管理工具,它能够帮助开发者高效地处理并发任务。本篇文章主要讨论了如何深入理解GCD中的dispatch_group、dispatch_barrier以及基于线程安全的多读单...
GCD(Grand Central Dispatch)是Apple在OS X和iOS系统中引入的一种多线程处理技术,旨在简化并发编程,提高应用程序的性能和响应速度。GCD利用了操作系统底层的调度机制,允许开发者以一种声明式的方式处理并发任务...
标题中的“gcdTest下载图片 dispatch_async”涉及到两个主要的iOS编程概念:GCD(Grand Central Dispatch)和异步图像下载。GCD是苹果为多核处理器优化并发编程提供的一种技术,而dispatch_async函数是GCD中用于在...
在iOS开发中,GCD(Grand Central Dispatch)是苹果提供的一种多线程解决方案,它能够帮助开发者有效地管理和调度并发任务,提高程序的执行效率。这个名为"ios-dispatch的简单demo.zip"的压缩包文件包含了关于GCD中...
iOS GCD(Grand Central Dispatch)是Apple在2010年引入的一种多线程解决方案,它为开发者提供了一种高效、简洁的方式来管理并发任务。GCD是基于Cocoa框架的,适用于iOS和Mac OS X平台。本文将深入探讨GCD的基本概念...
在iOS开发中,Grand Central Dispatch (GCD) 是一种强大的多线程管理工具,由Apple引入,用于简化并发编程。GCD timer是基于GCD的一种计时器实现,相较于NSTimer,它提供了一种更高效、更易于管理的计时器解决方案。...
在IT行业中,多线程是程序设计中的一个重要概念,特别是在iOS和macOS开发中,Grand Central Dispatch(GCD)提供了一种高效、简洁的方式来管理并发和多线程。GCD是Apple开发的一种并行编程技术,它充分利用了多核...
GCD,全称为Grand Central Dispatch,是Apple在Mac OS X 10.6 Snow Leopard以及后续版本中引入的一种多核并行处理技术。它是Cocoa框架的一部分,为开发者提供了高效利用多核处理器的能力,简化了并发编程。在iOS和...
GCD(Grand Central Dispatch)是苹果公司推出的多核并行运算解决方案,自动利用更多的CPU内核,自动管理线程的生命周期,程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码。 二、GCD的特点 1. ...
- iOS中的多线程主要通过`GCD (Grand Central Dispatch)`、`NSOperation`和`NSThread`来实现。本示例可能使用了`GCD`,因为它是最高效且易于使用的并发工具。 - `GCD`允许开发者在后台线程执行耗时任务,如下载,...
GCD(Grand Central Dispatch)是苹果推出的一种强大的多线程解决方案,它为开发者提供了简单而高效的方式来管理并发任务。本文将深入探讨GCD中的异步任务、线程锁以及如何在iOS中实现它们。 首先,我们要理解什么...
在iOS开发中,Grand Central Dispatch(GCD)是苹果公司提供的多线程解决方案,它极大地简化了并发编程。GCD是基于C语言的API,但同时也很好地与Objective-C和Swift兼容。这篇博客文章《ios gcd》可能深入探讨了如何...
在iOS开发中, Dispatch(也称为GCD,Grand Central Dispatch)是Apple提供的多线程和并发处理技术。这个“ios-dispatch的简单demo_.zip”压缩包文件包含了一个关于Dispatch学习的实例,主要涵盖了`apply`、`source`...
这涉及到GCD(Grand Central Dispatch)或OperationQueue的使用。 8. **错误处理和调试**:源码中可能包含了错误处理代码,这对于确保应用的稳定性和可靠性至关重要。同时,开发者可以学习如何使用Xcode的调试工具...