阅读了开源大神的YYDispatchQueuePool,在此记下一些从中学到的东西。

首先YYDispatchQueuePool.m文件中有如下类型对应:

static inline dispatch_queue_priority_t NSQualityOfServiceToDispatchPriority(NSQualityOfService qos) {

    switch (qos) {

        case NSQualityOfServiceUserInteractive: return DISPATCH_QUEUE_PRIORITY_HIGH;

        case NSQualityOfServiceUserInitiated: return DISPATCH_QUEUE_PRIORITY_HIGH;

        case NSQualityOfServiceUtility: return DISPATCH_QUEUE_PRIORITY_LOW;

        case NSQualityOfServiceBackground: return DISPATCH_QUEUE_PRIORITY_BACKGROUND;

        case NSQualityOfServiceDefault: return DISPATCH_QUEUE_PRIORITY_DEFAULT;

        default: return DISPATCH_QUEUE_PRIORITY_DEFAULT;

    }

}

NSQualityOfService枚举定义了以下值:

  • UserInteractive:和图形处理相关的任务,比如滚动和动画。
  • UserInitiated:用户请求的任务,但是不需要精确到毫秒级。例如,如果用户请求打开电子邮件App来查看邮件。
  • Utility:周期性的用户请求任务。比如,电子邮件App可能被设置成每五分钟自动检查新邮件。但是在系统资源极度匮乏的时候,将这个周期性的任务推迟几分钟也没有大碍。
  • Background:后台任务,用户可能并不会察觉对这些任务。比如,电子邮件App对邮件进行引索以方便搜索。

而对于QOS YYDispatchQueuePool也有如下对应关系:

1.  NSQualityOfServiceUserInteractive -> QOS_CLASS_USER_INTERACTIVE

2.  NSQualityOfServiceUserInitiated -> QOS_CLASS_USER_INITIATED

3.  NSQualityOfServiceUtility -> QOS_CLASS_USER_INITIATED

4. NSQualityOfServiceBackground -> QOS_CLASS_BACKGROUND

5. NSQualityOfServiceDefault -> QOS_CLASS_DEFAULT

我们可以看出在创建线程池的时候会与GCD里面的线程Dispatch Queue产生映射关系。

接下来他定义了这样一个结构体

typedef struct {

const char *name;  // 定义一个name指针,用来储存队列名称

void **queues;  //定义一个queues,指向队列的内存地址

uint32_t queueCount; //队列个数

int32_t counter;   //好吧,这里我也不是很清楚

} YYDispatchContext;

YYDispatchContextCreate (const char *name,  uint32_t queueCount,   NSQualityOfService qos);  //这里类似于C++里面的构造方法,也类似于OC里面的init方法,返回YYDispatchContext对象。

static YYDispatchContext *YYDispatchContextCreate(const char *name,
uint32_t queueCount,
NSQualityOfService qos) {
YYDispatchContext *context = calloc(, sizeof(YYDispatchContext));
if (!context) return NULL;
context->queues = calloc(queueCount, sizeof(void *));
if (!context->queues) {
free(context);
return NULL;
}
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) { } else {
long identifier = NSQualityOfServiceToDispatchPriority(qos);
for (NSUInteger i = ; i < queueCount; i++) {
dispatch_queue_t queue = dispatch_queue_create(name, DISPATCH_QUEUE_SERIAL);
dispatch_set_target_queue(queue, dispatch_get_global_queue(identifier, ));
context->queues[i] = (__bridge_retained void *)(queue);
}
}
context->queueCount = queueCount;
if (name) {
context->name = strdup(name); //字符串拷贝函数
}
return context;
}

这里首先根据队列个数开辟相应个数的内存空间,然后再将QOS状态转换成队列优先级状态。前面已经列出了对应关系。根据初始化队列个数利用dispatch_queue_create(name,DISPATCH_QUEUE_SERIAL)生成对应的线程加到串行队列里面去。最后给YYDispatchContext的结构体赋值。同理,

YYDispatchContextRelease(YYDispatchContext *context)  //即为释放YYDispatchContext的方法,同样的我们来看一看源码

static void YYDispatchContextRelease(YYDispatchContext *context) {
if (!context) return;
if (context->queues) {
for (NSUInteger i = ; i < context->queueCount; i++) {
void *queuePointer = context->queues[i];
dispatch_queue_t queue = (__bridge_transfer dispatch_queue_t)(queuePointer);
const char *name = dispatch_queue_get_label(queue);
if (name) strlen(name);
queue = nil;
}
free(context->queues);
context->queues = NULL;
}
if (context->name) free((void *)context->name);
}

这里我们同样的遍历YYDispatchContext的队列,先是通过YYDispatchContext结构体的queues指针获取到dispatch_queue_t,然后对队列清空,最后利用C语言的free()函数释放内存空间。

获取队列方法如下:

static dispatch_queue_t YYDispatchContextGetQueue(YYDispatchContext *context) {
int32_t counter = OSAtomicIncrement32(&context->counter);
if (counter < ) counter = -counter;
void *queue = context->queues[counter % context->queueCount];
return (__bridge dispatch_queue_t)(queue);
}

之前讲到counter的时候不太理解这个的含义,这里代码主要是通过context获取队列。

接着

YYDispatchContext *YYDispatchContextGetForQOS(NSQualityOfService qos) ; //此方法是根据对应的qos状态创建YYDispatchContext;

最后使用起来也是比较方便,请参考YY大神的YYDispatchQueuePool

整个demo涵盖着对GCD的深入理解,C语言尤为重要



YYDispatchQueuePool阅读笔记的更多相关文章

  1. 阅读笔记 1 火球 UML大战需求分析

    伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本   <火球 UML大战需求分析>,首先 ...

  2. [阅读笔记]Software optimization resources

    http://www.agner.org/optimize/#manuals 阅读笔记Optimizing software in C++   7. The efficiency of differe ...

  3. 《uml大战需求分析》阅读笔记05

    <uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...

  4. <<UML大战需求分析>>阅读笔记(2)

    <<UML大战需求分析>>阅读笔记(2)> 此次读了uml大战需求分析的第三四章,我发现这本书讲的特别的好,由于这学期正在学习设计模式这本书,这本书就讲究对uml图的利用 ...

  5. uml大战需求分析阅读笔记01

    <<UML大战需求分析>>阅读笔记(1) 刚读了uml大战需求分析的第一二章,读了这些内容之后,令我深有感触.以前学习uml这门课的时候,并没有好好学,那时我认为这门课并没有什 ...

  6. Hadoop阅读笔记(七)——代理模式

    关于Hadoop已经小记了六篇,<Hadoop实战>也已经翻完7章.仔细想想,这么好的一个框架,不能只是流于应用层面,跑跑数据排序.单表链接等,想得其精髓,还需深入内部. 按照<Ha ...

  7. Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable

    酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...

  8. Hadoop阅读笔记(五)——重返Hadoop目录结构

    常言道:男人是视觉动物.我觉得不完全对,我的理解是范围再扩大点,不管男人女人都是视觉动物.某些场合(比如面试.初次见面等),别人没有那么多的闲暇时间听你诉说过往以塑立一个关于你的完整模型.所以,第一眼 ...

  9. Hadoop阅读笔记(四)——一幅图看透MapReduce机制

    时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的.如果有幸能有大牛路过, ...

随机推荐

  1. MongoDB(一)——简介

    这两天简单学习了一下MongoDB数据库,属于NoSQL类型数据库的一种,先简单宏观的看一下NoSQL的相关知识和MongoDB的基础知识. NoSQL是Not Only SQL的缩写,它指的是非关系 ...

  2. bzoj4519: [Cqoi2016]不同的最小割(分治最小割)

    4519: [Cqoi2016]不同的最小割 题目:传送门 题解: 同BZOJ 2229 基本一样的题目啊,就最后用set记录一下就ok 代码: #include<cstdio> #inc ...

  3. iOS定义静态变量、静态常量、全局变量

    静态变量 当我们希望一个变量的作用域不仅仅是作用域某个类的某个对象,而是作用域整个类的时候,这时候就可以使用静态变量. staticstatic修饰的变量,是一个私有的全局变量.C或者Java中sta ...

  4. springMVC下ajax获取后台参数直接走错误或者报406错误问题解决

    直接走错误: 返回的结果是否json化,直接返回非字符串的结果会走ajax的error函数. 报406错误: 我在学习springmvc过程中(我的项目是配置的后缀是.html),从controlle ...

  5. Glide错误java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity

    解决办法 在使用Glide的那段代码加是否在主线程判断 if(Util.isOnMainThread()) { Glide.with(ClassifyItemDetailActivity.this). ...

  6. NEON基本知识

    http://blog.csdn.net/EmSoftEn/article/details/51834171 http://blog.csdn.net/yxnyxnyxnyxnyxn/article/ ...

  7. map、栈————下一个更大的元素(待定,栈解法学习中)

    方法一 先遍历nums2,将每个元素后面第一个大的元素一起存入到map中,然后在遍历nums1,在map中找到. class Solution { public: vector<int> ...

  8. [APIO2012]派遣 可并堆(左偏树)

    没啥说的,自底向上合并大根堆即可. 一边合并,一边贪心弹堆顶直到堆的总和不大于预算. Code: #include <cstdio> #include <algorithm> ...

  9. (五)Redux入门

    1 Redux概念简述 flux推出的时候有一些缺点.比如store可以存在多个,不是特别好用 于是逐渐进化为了redux. 2 Redux的工作流程 拿借书作举例: action creators是 ...

  10. 前端路由的两种模式:hash(#)模式和history模式(转)

    随着 ajax 的使用越来越广泛,前端的页面逻辑开始变得越来越复杂,特别是spa的兴起,前端路由系统随之开始流行. 从用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下): 记 ...