学计算机的那个

不是我觉到、悟到,你给不了我,给了也拿不住;只有我觉到、悟到,才有可能做到,能做到的才是我的.

0%

YYDispatchQueuePool全局队列管理工具

大体上原理,就是通过创建不同优先级的context(5个),context中创建有限数量的queue(CPU核数)。
在使用的时候,通过优先级获取不同的context,然后轮着返回不同的queue让你换着用,你就可以一定程度上实现并行队列,并且控制线程数量。

OverView

我写了一个简单的工具 YYDispatchQueuePool,为不同优先级创建和 CPU 数量相同的 serial queue,每次从 pool 中获取 queue 时,会轮询返回其中一个 queue。我把 App 内所有异步操作,包括图像解码、对象释放、异步绘制等,都按优先级不同放入了全局的 serial queue 中执行,这样尽量避免了过多线程导致的性能问题。

QOS

iOS8提供了一种新的优先级类型Thread quality of service (QOS),官方建议是iOS 8以上优先使用QOS,以下兼容老的优先级宏,

在iOS8之后统一为5个等级

1
2
3
4
5
NSQualityOfServiceUserInteractive:最高优先级, 用于处理 UI 相关的任务
NSQualityOfServiceUserInitiated:次高优先级, 用于执行需要立即返回的任务
NSQualityOfServiceUtility:普通优先级,主要用于不需要立即返回的任务
NSQualityOfServiceBackground:后台优先级,用于处理一些用户不会感知的任务
NSQualityOfServiceDefault:默认优先级,当没有设置优先级的时候,线程默认优先级
1
2
3
4
5
6
7
8
9
10
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;
}
}
  • NSQualityOfServiceUserInteractive 表示用户交互任务,任务优先级高
  • NSQualityOfServiceUserInitiated 用户发起的需要立即得到回应的任务,优先级高
  • NSQualityOfServiceUtility 不需要立刻返回结果的任务,执行时间稍长。比如下载图片,数据请求
  • NSQualityOfServiceBackground 后台任务,对用户不可见,比如数据备份。任务的时间比较长
  • NSQualityOfServiceDefault 默认优先级任务,处于UserInitiated和Utility之间

GCD队列

GCD 有三种队列类型.

  • main queue:     主队列.
  • global queue:   全局队列.
  • custom queue: 自定义队列.

系统提供了五种队列:
一种是,Main Queue 是一种串行队列,在主线程中执行,可以通过dispatch_get_main_queue()获取

其余四中是:优先级分别为high,default,low,background的并行队列,可以通过dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);

这里第一个参数是优先级,第二个参数是0,这里是官方文档说的哈!

参考

YYDispatchQueuePool 学习笔记