阅读了开源大神的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. 前端防止button被多次点击

    前端的部分逻辑有时候控制前端的显示.比方记录收藏数目等等.有时候多次反复点击会造成前端显示的bug.所以须要有部分逻辑推断去筛除掉反复多次的点击. 实现部分代码例如以下,主要是通过setTimeout ...

  2. CxImage内存方式转换图像

    最近,处于项目需要,需要将Bmp转换为JPEG格式.以前做过,采用的是GDI+的方式,该方式有一个极大地缺陷为无法实现跨平台处理.闲话少说,进入正题. CxImage cxImageBmp(pRGBB ...

  3. 使用TensorBoard可视化工具

    title: 使用TensorBoard可视化工具 date: 2018-04-01 13:04:00 categories: deep learning tags: TensorFlow Tenso ...

  4. JavaScript中Math常用方法

    title: JavaScript中Math常用方法 toc: false date: 2018-10-13 12:19:31 Math.E --2.718281828459045,算数常量e Mat ...

  5. FastJSON杂项

    //通过TypeReference解决泛型的问题 List<Integer> rst = JSON.parseObject(v,new TypeReference<List<I ...

  6. Scalable, Distributed Systems Using Akka, Spring Boot, DDD, and Java--转

    原文地址:https://dzone.com/articles/scalable-distributed-systems-using-akka-spring-boot-ddd-and-java Whe ...

  7. 三级联动(ajax同步)

    html <div id="frame"></div> js $(function(){ //拼接省市区下拉框 var str = `<select ...

  8. 如何用一个app操作另外一个app.比如微信群控那样的

    如何实现一个app.控制另外的app,比如市面上群控微信的,是用测试工具的原理?还是什么模拟点击的原理? 如何用一个app操作另外一个app.比如微信群控那样的 >> android这个答 ...

  9. c#学习0217

    1 继承 继承 1 子类是否继承了父类的构造函数 答案:子类并没有继承父类的构造函数 但是子类或默认调用父类的无参数的构造函数 在子类中创建父类对象 这样子类才可以使用父类的成员 如果在父类中声明了有 ...

  10. 洛谷 P2633 Count on a tree 主席树

    在一棵树上,我们要求点 $(u,v)$ 之间路径的第$k$大数. 对于点 $i$  ,建立 $i$  到根节点的一棵前缀主席树. 简单容斥后不难得出结果为$sumv[u]+sumv[v]−sumv[l ...