什么是GCD
概述:
Grand Central Dispatch (GCD)包括语言特性、运行时库和系统增强,它们提供了系统的全面改进,支持在macOS、iOS、watchOS和tvOS中的多核硬件上并发代码执行。
BSD子系统、Core Foundation和Cocoa api都得到了扩展,可以使用这些增强来帮助系统和应用程序更快、更有效地运行,并提高响应能力。考虑一下,对于一个应用程序来说,有效地使用多个核是多么困难,更不用说在具有不同数量计算核的不同计算机上或在多个应用程序争夺这些核的环境中进行操作了。GCD在系统级别上运行,可以更好地适应所有正在运行的应用程序的需要,以一种平衡的方式将它们与可用的系统资源进行匹配。
调度对象和圆弧
当你使用Objective-C编译器构建应用时,所有分派对象都是Objective-C对象。因此,当启用自动引用计数(ARC)时,分派对象会像任何其他Objective-C对象一样被保留并自动释放。在不启用ARC时,使用dispatch_retain和dispatch_release函数(或Objective-C语义)来保留和释放分派对象。您不能使用Core Foundation retain/release函数。
如果您需要在一个支持arc的应用程序中使用retain/release语义,并在稍后的部署目标中使用(为了维护与现有代码的兼容性),您可以通过向编译器标志添加-DOS_OBJECT_USE_OBJC=0来禁用基于objective - c的分派对象。
/*
队列执行的优先级
@typedef dispatch_queue_priority_t
类型的dispatch_queue_priority
@constant DISPATCH_QUEUE_PRIORITY_HIGH
分配到队列的项将以高优先级运行,
也就是说,队列将在之前被调度执行
任何默认优先级或低优先级队列。
@constant DISPATCH_QUEUE_PRIORITY_DEFAULT
分派到队列的项将在默认情况下运行
优先级,即队列将被调度以执行
在调度了所有高优先级队列之后,但是
在调度任何低优先级队列之前。
@constant DISPATCH_QUEUE_PRIORITY_LOW
分配到队列的项将以低优先级运行,
也就是说,队列最终将被调度执行
默认优先级和高优先级队列已经
预定。
@constant DISPATCH_QUEUE_PRIORITY_BACKGROUND
分配到队列的项将以后台优先级i运行
将在所有高优先级队列之后调度执行吗
计划,系统将运行项目在这个队列上的一个threa
根据setpriority(2)(即磁盘I/O是thrott)的后台状态
线程的调度优先级设置为最小值)。
最后总结:
DISPATCH_QUEUE_PRIORITY_HIGH高优先级运行
DISPATCH_QUEUE_PRIORITY_DEFAULT 默认优先级
DISPATCH_QUEUE_PRIORITY_LOW低优先级运行
DISPATCH_QUEUE_PRIORITY_BACKGROUND后台优先级i运行
*/
dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
for (int i=0; i<10000; i++) {
NSLog(@"线程==%@ 打印数据==%d",[NSThread currentThread],i);
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i=0; i<10000; i++) {
NSLog(@"异步线程==%@ 打印数据==%d",[NSThread currentThread],i);
}
});
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i=0; i<10000; i++) {
NSLog(@"同步线程==%@ 打印数据==%d",[NSThread currentThread],i);
}
});
/*
打印结果
同步线程==<NSThread: 0x600000dc1400>{number = 1, name = main} 打印数据==0
线程==<NSThread: 0x600000d95bc0>{number = 3, name = (null)} 打印数据==0
异步线程==<NSThread: 0x600000d92b80>{number = 4, name = (null)} 打印数据==0
*/