GCD的Queue-Specific
为了能够判断当前queue是否是之前创建的queue,
我们可以利用dispatch_queue_set_specific和dispatch_get_specific给queue关联一个context data,
后面再利用这个标识获取到context data。
如果可以获取到说明当前上下文是在自己创建的queue中,如果不能获取到context data则表示当前是在其他队列上。
NSString *queueKey = @"queueKey1";
dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_set_specific(queue, (__bridge const void * _Nonnull)(queueKey)
, &queueKey, NULL); NSLog(@"1.当前线程:%@ 队列:%@", [NSThread currentThread], dispatch_get_current_queue()); if (dispatch_get_specific((__bridge const void * _Nonnull)(queueKey))) {
NSLog(@"2.当前线程:%@ 队列:%@", [NSThread currentThread], dispatch_get_current_queue());
}else{
NSLog(@"3.当前线程:%@ 队列:%@", [NSThread currentThread], dispatch_get_current_queue());
} dispatch_sync(queue, ^{ if (dispatch_get_specific((__bridge const void * _Nonnull)(queueKey))) {
NSLog(@"4.当前线程:%@ 队列:%@", [NSThread currentThread], dispatch_get_current_queue());
}else{
NSLog(@"5.当前线程:%@ 队列:%@", [NSThread currentThread], dispatch_get_current_queue());
}
});
输出信息
2018-02-13 16:44:13.977719+0800 CGD[14596:276910] 1.当前线程:<NSThread: 0x604000260180>{number = 1, name = main} 队列:<OS_dispatch_queue_main: com.apple.main-thread>
2018-02-13 16:44:13.977900+0800 CGD[14596:276910] 3.当前线程:<NSThread: 0x604000260180>{number = 1, name = main} 队列:<OS_dispatch_queue_main: com.apple.main-thread>
2018-02-13 16:44:13.978047+0800 CGD[14596:276910] 4.当前线程:<NSThread: 0x604000260180>{number = 1, name = main} 队列:<OS_dispatch_queue: testQueue>
GCD的Queue-Specific的更多相关文章
- gcd的queue与group
queue相当于事件处理机制里的事件池:只是任务池: 线程作为事件处理的实施者,由线程池从任务池中获取任务进行调度派发: group相当与工作组,按照任务的相关性对任务进行组织.
- GCD详解
什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像 NSOperationQueue,他们都允 ...
- Grand Central Dispatch (GCD)
Grand Central Dispatch (GCD) Reference Grand Central Dispatch (GCD) comprises language features, run ...
- iOS 并行编程:GCD Dispatch Sources
1 简介 dispatch source是一种用于处理事件的数据类型,这些被处理的事件为操作系统中的底层级别.Grand Central Dispatch(GCD)支持如下的dispatch sour ...
- ios之gcd浅析
A.普通的GCD异步运行与主线程更新写法: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^ ...
- 什么是gcd
概述 我将分四步来带大家研究研究程序的并发计算. 第一步是主要的串行程序,然后使用GCD把它并行计算化.假设你想顺着步骤来尝试这些程序的话,能够下载源代码. 注意.别执行imagegcd2.m,这是个 ...
- 深入GCD(五):资源竞争
概述我将分四步来带大家研究研究程序的并发计算.第一步是基本的串行程序,然后使用GCD把它并行计算化.如果你想顺着步骤来尝试这些程序的话,可以下载源码.注意,别运行imagegcd2.m,这是个反面教材 ...
- 玩转iOS开发:iOS中的GCD开发(三)
上一章, 我们了解到了GCD里的一些队列和任务的知识, 也实践了一下, 同时我们也对主队列的一些小情况了解了一下, 比如上一章讲到的卡线程的问题, 如果没有看的朋友可以去看看玩转iOS开发:iOS中的 ...
- AFNetworking到底做了什么
写在开头: 作为一个iOS开发,也许你不知道NSUrlRequest.不知道NSUrlConnection.也不知道NSURLSession...(说不下去了...怎么会什么都不知道...)但是你一定 ...
- iOS 1-2年经验面试参考题
Model层: 数据持久化存储方案有哪些? 沙盒的目录结构是怎样的?各自一般用于什么场合? SQL语句问题:inner join.left join.right join的区别是什么? SQLite的 ...
随机推荐
- Flask 教程 第五章:用户登录
本文翻译自The Flask Mega-Tutorial Part V: User Logins 这是Flask Mega-Tutorial系列的第五部分,我将告诉你如何创建一个用户登录子系统. 你在 ...
- JVM发生full gc的情景有哪些
除直接调用System.gc外,触发Full GC执行的情况有如下四种.1. 旧生代空间不足 旧生代空间只有在新生代对象转入及创建为大对象.大数组时才会出现不足的现象,当执行Full GC后空间仍然不 ...
- Customize the View Items Layout 自定义视图项目布局
In this lesson, you will learn how to customize the default editor layout in a Detail View. For this ...
- jQuery中$()函数的7种用法汇总
前言 jQuery对象是一个类数组的对象,含有连续的整形属性以及一系列的jQuery方法.它把所有的操作都包装在一个jQuery()函数中,形成了统一(也是惟一)的操作入口.其中我们用的非常频繁的一个 ...
- UIView创建xib
这里有两种类都可以实现,但是推荐用Empty类来创建 (Empty): 参考链接:https://blog.csdn.net/wtdask/article/details/76439295 https ...
- 【转载】C++编译过程
C++编译过程 C++ 编译过程在介绍编译器之前,先简单地说一下 C++ 的编译过程,以便理解编译器的工作.编译(compiling)并不意味着只创建仅仅一个可执行文件.创建一个可执行文件是一个多级过 ...
- Docker启动守护式容器
目录 启动守护式容器 查看容器日志 docker后台运行 查看容器内运行的进程 查看容器内部细节 进入正在运行的容器并以命令行交互 重新进入 上述两个区别 从容器内拷贝文件到主机上 启动守护式容器 ...
- eNSP仿真软件之VLAN基础配置及Access接口
★Access接口是交换机上用来连接用户主机的接口. 实验内容: 实验步骤: (1) 打开仿真软件eNSP,新建拓扑.根据实验内容建立如下实验拓扑图. (2) 按照如下的编址表对每 ...
- 二、ITK例子-jpg图像读写
一.ITK的读写工作原理 在ITK里面,我们需要设置读取图像的像素类型,图像类型. 然后设置读取指针,将读取参数传入. 同时设置写指针,也将写入文件参数传入. 为了实现读写动作,我们需要构造一个IO工 ...
- C++ 标准库,可变参数数量,参数类型相同
#include <iostream> // 可变模板参数 // 此例:可以构造可变数量,可变类型的函数输入. // 摘自:https://www.cnblogs.com/qicosmos ...