阅读了开源大神的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. HDU 5353 Average

    Problem Description There are n soda sitting around a round table. soda are numbered from 1 to n and ...

  2. poj 2488 A Knight&#39;s Journey(dfs+字典序路径输出)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem? id=2488 ----- ...

  3. hdu 4966 最小树形图

    将每门课等级拆成0,1,2,3...a[i]个点,对每一个等级大于0的点向它低一级连边,权值为0[意思是,若修了level k.则level(0~k)都当做修了] 将输入的边建边,权值为money[i ...

  4. node--19 moogose demo1

    db.js /** * Created by Danny on 2015/9/28 16:44. */ //引包 var mongoose = require('mongoose'); //创建数据库 ...

  5. 创建表空间及plsql查看远程表空间路径

    -新建表空间,登录名和密码 --请尽量把表空间和别的系统分离,这里以Search为例子,登录名和密码以test为例子 create tablespace Search logging datafile ...

  6. SpringMVC+Spring+Hibernate框架整合原理,作用及使用方法

    转自:https://blog.csdn.net/bieleyang/article/details/77862042 SSM框架是spring MVC ,spring和mybatis框架的整合,是标 ...

  7. HTML基础——网站图片显示页面

    1.图片标签 <img /> 属性: src:指的是图片显示的路径(位置) 绝对路径:D:\Pictures\Saved Pictures 相对路径: ①同一级:直接写文件名称或者./文件 ...

  8. 机器学习(十一) 支持向量机 SVM(上)

    一.什么是支撑向量机SVM (Support Vector Machine) SVM(Support Vector Machine)指的是支持向量机,是常见的一种判别方法.在机器学习领域,是一个有监督 ...

  9. ASP.NET 让ajax请求webform后台方法

    $.ajax({ type: "POST", url: ".aspx/getSubjectDirection", data: JSON.stringify({ ...

  10. HDU 1010 Tempter of the Bone【DFS】

    学习剪枝的第一篇@_@学习别人的剪枝,一剪就是两天@_@---- 参看的这篇--http://blog.csdn.net/libin56842/article/details/8962512自己的小体 ...