XZHGCDDispatcher
XZHGCDDispatcher基于YYKit
中的YYDispatchQueuePool
组件。
示例
要运行示例项目,首先克隆仓库,然后在示例目录下运行 pod install
。
需求
此库需要iOS 8.0+
和Xcode 8.0+
。
安装
XZHGCDDispatcher可以通过CocoaPods获得。要安装它,只需将以下行添加到您的Podfile中
pod 'XZHGCDDispatcher'
使用
使用默认全局单例连接池实例入队
for (int i = 0; i < 100; i++) {
switch ((i%5)) {
case 0: {
XZHAsyncWithQOSUserInteractive(^{
NSLog(@"task %d: %@", i, [NSThread currentThread]);
});
}
break;
case 1: {
XZHAsyncWithQOSUserInitiated(^{
NSLog(@"task %d: %@", i, [NSThread currentThread]);
});
}
break;
case 2: {
XZHAsyncWithQOSUtility(^{
NSLog(@"task %d: %@", i, [NSThread currentThread]);
});
}
break;
case 3: {
XZHAsyncWithQOSBackgroud(^{
NSLog(@"task %d: %@", i, [NSThread currentThread]);
});
}
break;
case 4: {
XZHAsyncWithQOSDefault(^{
NSLog(@"task %d: %@", i, [NSThread currentThread]);
});
}
break;
}
}
pool instance = nil
释放连接池
使用新连接池实例入队,不使用时设置 _pool = [[XZHDispatchQueuePool alloc] initWithName:@"test" queueCount:0];
for (int i = 0; i < 1000; i++)
{
XZHAsyncPoolWithQOSUserInteractive(_pool, ^{
NSLog(@"%@", [NSThread currentThread]);
});
XZHAsyncPoolWithQOSUserInitiated(_pool, ^{
NSLog(@"%@", [NSThread currentThread]);
});
}
_pool = nil;
并发队列可能导致线程数量增加
dispatch_get_global_queue()
dispatch_queue_create(label, concurrent)
结论
应避免随意使用并发队列。
串行队列相同的可能产生
- 1、循环创建串行队列
- 2、频繁创建和销毁重型对象(AVPlayer、AVPlayerLayer...)
控制线程并发
- 1、使用池机制控制线程的最大并发数
- 2、因为在移动终端应用中的大多数CPU任务并不消耗太多时间。
- 3、因此不需要太多的线程
- 4、但是过多的线程会导致CPU切换和资源竞争,从而降低性能。
- 5、避免频繁创建和销毁线程,并控制并发线程的数量,既可以满足并发CPU的需求,又不会因为过多的线程导致性能损失
作者
xiongzenghui, [email protected]
许可证
XZHGCDDispatcher 在 MIT 许可证下可用。更多信息请参阅 LICENSE 文件。