dispatch_get_current_queue 废弃
由于iOS7以后 dispatch_get_current_queue 被废弃,所以需要寻找一个替代的方案。
发现 dispatch_get_current_queue 并没有字面上那么简单。
这个函数一般都会跟 dispatch_async 等API配合,
但是试想一下,我们自己创建的线程(比如 NSThread)跟 dispatch_queue_t 没有关系,
那么在我们的线程中调用 dispatch_get_current_queue 会返回什么呢?
[NSThread detachNewThreadSelector:@selector(onPlay:) toTarget:self withObject:nil];
- (void)onPlay
{
dispatch_queue_t dispatch_queue = dispatch_get_current_queue(); // 这里会返回什么?
}
在上面的代码中,我们并没有将onPlay显示投递到某一个dispatch_queue中,
但是dispatch_get_current_queue还是会返回一个dispatch_queue,
一个名字叫 com.apple.root.default-overcommit-priority 的 dispatch_queue!
但是!
如果在 onPlay 中打断点,你会发现,onPlay 并不在 com.apple.root.default-overcommit-priority 这个队列中!
[NSThread detachNewThreadSelector:@selector(onPlay:) toTarget:self withObject:nil];
- (void)onPlay
{
NSLog(@"1");
dispatch_async(dispatch_get_current_queue(), ^{
NSLog(@"2");
});
}
两句NSLog将不在同一个queue中打印!
好,以下分析dispatch_get_current_queue更深一层的行为。
先分析官方文档的说法:
函数声明:
dispatch_queue_t dispatch_get_current_queue(void);
描述(description):
Returns the queue on which the currently executing block is running.
返回当前所在的队列(dispatch_queue_t)。
详述(discussion):
This function is defined to never return NULL.
When called from outside of the context of a submitted block,
this function returns the main queue if the call is executed from the main thread.
If the call is made from any other thread, this function returns the default concurrent queue.
当调用这个函数的地方不是在某个已提交到队列的block内部时,
如果在主线程中被调用,则返回main_queue。
如果不在主线程中调用,则返回一个默认的并行队列。
我们先尝试将线程分成三种类型:
主线程
只有一个,并且存在一个与该线程绑定的 dispatch_queue,名字是 com.apple.main-thread,可以通过 dispatch_get_main_queue 得到。
dispatch_queue 线程
dispatch_queue 自己创建的线程,该线程当然是与创建它的 dispatch_queue 绑定。
其他线程
通过NSThread,POSIX,[NSObject performSelectorInBackground]等接口创建出来的线程,没有与之绑定的 dispatch_queue。
那么官方文档说的其他线程(any other thread),指的就是除主线程,dispatch_queue 线程之外的线程。
这些线程没有与之绑定的 dispatch_queue,所以会返回一个 “默认的并行队列(default concurrent queue)”。
这是个什么东西呢?我们用文章开头的代码,打印出这个队列的名字。
[NSThread detachNewThreadSelector:@selector(onPlay:) toTarget:self withObject:nil];
- (void)onPlay
{
dispatch_queue_t dispatch_queue = dispatch_get_current_queue();
NSLog(@"%s", dispatch_queue_get_label(dispatch_queue));
}
其结果是:com.apple.root.default-overcommit-priority。
也就是说,如果执行 dispatch_get_current_queue 的线程没有与之绑定的队列的时候,
会返回一个 com.apple.root.default-overcommit-priority 的队列,这个队列跟该线程没有关系。
可以理解为 dispatch_get_current_queue 这个函数的例外情况。
可以猜测 dispatch_get_current_queue 被废弃的原因就是这个函数不一定总是有意义的。
每一个well-known global queue 都有一个与之对应的 overcommit 类型的queue。
overcommit 类型的 queue 具体是什么用途,为什么会分开暂时还不知道。
整理:
以下是iOS应用程序中默认创建的队列:
优先级 名称
well-known global queue
High priority (com.apple.root.high-priority)
Default priority (com.apple.root.default-priority)
Low priority (com.apple.root.low-priority)
Background priority (com.apple.root.background-priority)
overcommit global queue
High priority (com.apple.root.high-overcommit-priority)
Default priority (com.apple.root.default-overcommit-priority)
Low priority (com.apple.root.low-overcommit-priority)
Background priority (com.apple.root.background-overcommit-priority)
main queue
Main-Thread (com.apple.main-thread)
各种API获取到的队列:
dispatch_get_global_queue 相应优先级的 well-known global queue
dispatch_get_main_queue com.apple.main-thread
各种情况下调用dispatch_get_current_queue得到的队列:
主线程中 com.apple.main-thread
NSThread com.apple.root.default-overcommit-priority
pthread com.apple.root.default-overcommit-priority
[NSObject performSelectorInBackground] com.apple.root.default-overcommit-priority
NSOperationQueue com.apple.root.default-priority
NSOperationQueue使用GCD实现,具体内部会使用 com.apple.root.default-priority 队列来执行任务。
NSBlockOperation或者NSInvocationOperation都会被投递到这个dispatch_queue中。

dispatch_get_current_queue 废弃的更多相关文章
- ElasticSearch 5学习(9)——映射和分析(string类型废弃)
在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...
- mysql_connect() php7不支持,php5.5可以,是废弃函数
天用了PHP7,发现和PHP5变化还挺大的,最大的就是MySQL的连接库变了. PHP5中使用mysql_connect()函数进行连接,但实际上,PHP5.5开始,MySQL就不推荐使用了,属于废弃 ...
- 让我们一起用开源数据库和开源框架废弃Access
一.为什么要废弃Access? 1.客户的机子上需要安装access的驱动 ps:这个比较烦人,大家都知道部署越简单越好,安装这个对用户来说太繁琐了. 2.操作时性能不佳 using System; ...
- PHP 5.4 已废弃 magic_quotes_gpc,PHP安全转义函数详解(addslashes 、htmlspecialchars、htmlentities、mysql_real_escape_string、strip_tags)
1. addslashes() addslashes()对SQL语句中的特殊字符进行转义操作,包括(‘), (“), (), (NUL)四个字符,此函数在DBMS没有自己的转义函数时候使用,但是如果D ...
- svn更新路径,解决办法详细步骤,eclipse里面的更新方法,svn废弃位置,Windows环境,svn服务器地址换了,如何更新本地工作目录
svn更新路径,解决办法详细步骤,eclipse里面的更新方法,svn废弃位置,Windows环境,svn服务器地址换了,如何更新本地工作目录 Windows下,svn服务器IP本来是内网一台服务器上 ...
- 关于iOS和OS X废弃的API你需要知道的一切
如你所知,已废弃(Deprecated)的API指的是那些已经过时的并且在将来某个时间最终会被移除掉的方法或类.通常,苹果在引入一个更优秀的API后就会把原来的API给废弃掉.因为,新引入的API通常 ...
- [译]关于iOS和OS X废弃的API你需要知道的一切
原文: Everything You Need to Know about iOS and OS X Deprecated APIs 如你所知,已废弃(Deprecated)的API指的是那些已经过时 ...
- HTML5之废弃和更新的元素与属性
废弃的元素和属性 [1]标签替换 <acronym> 替代:<abbr> <applet> 替代:<embed> 或 <object> &l ...
- 关于iOS和OS X废弃的API知识点
今天在查看苹果接口文档时,突然对于接口的声明知识点比较感兴趣,再网络找到下面这个比较不错的文章,记录一下并分享: 如你所知,已废弃(Deprecated)的API指的是那些已经过时的并且在将来某个时间 ...
随机推荐
- 经典SQL练习题
题目地址:http://blog.csdn.net/qaz13177_58_/article/details/5575711 1. 查询Student表中的所有记录的Sname.Ssex和Class列 ...
- ie9以上浏览器input文本框/密码框后面的小叉子/小眼睛问题
找了很久不知什么属性控制的这个东西,经过群友的指点重要找到.
- Hibernate报错 ** is not mapping
使用easyui+struts+hibernate 新增加一个页面功能时,总是报错,后来发现是数据库语句,不能写表名称,而是要写映射的数据库实体类名 1.struts文件修改增加action < ...
- 开启/关闭ubuntu防火墙
LInux原始的防火墙工具iptables由于过于繁琐,所以ubuntu系统默认提供了一个基于iptable之上的防火墙工具ufw.而UFW支持图形界面操作,只需在命令行运行ufw命令即能看到一系列的 ...
- int和Integer——个人学习
1.首先要知道Java的八大基本数据类型:short.int.long.float.double.char.byte.boolean. 2.这八种基本数据类型对应的包装类分别为:Short.Integ ...
- spm使用之七不用seajs改用headjs起步
这几天在看phpwind官方网站, 他们的前端用了一个叫做head.js的js加载器, 官方网站在 http://headjs.com/ 号称是你只需要在你的html文件中的<head>& ...
- A simple brute force problem.
hdu4971:http://acm.hdu.edu.cn/showproblem.php?pid=4971 题意:给你n个项目,每完成一个项目会有一定的收益,但是为了完成某个项目,要先学会一些技能, ...
- 【POJ11855】 Buzzwords (后缀数组)
Description The word “the” is the most commonthree-letter word. It evenshows up inside other words, ...
- 【UVALive - 3211】Now or later (二分+2-SAT)
题意: 有n架飞机需要着陆.每架飞机有两种选择,早着陆或者晚着陆,二选其一.现在为了保证飞机的着陆安全,要求两架着陆的飞机的时间间隔的最小值达到最大. 分析: 最小值最大问题我们想到二分答案.对于猜测 ...
- 【UVA1371】Period (二分+DP)
题意: 给出两个字符串A,B将B分解成若干个子字符串,然后每个子字符串都要经过编辑变成字符串A,所有子串中编辑最多的次数即为当前状态下的最大编辑次数,要求求最小的最大编辑次数. 编辑操作包括修改.删除 ...