/*感谢开发者http://blog.csdn.net/totogo2010/article/details/8016129提供基础理论*/
介绍:
Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。它首次发布在Mac OS X 10.6 ,iOS 4及以上也可用。
GCD的工作原理是:让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。
一个任务可以是一个函数(function)或者是一个block。 GCD的底层依然是用线程实现,不过这样可以让程序员不用关注实现的细节。
GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行
dispatch queue分为下面三种:
Serial
又称为private dispatch queues,同时只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。当你创建多个Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。
Concurrent
又称为global dispatch queue,可以并发地执行多个任务,但是执行完成的顺序是随机的。
Main dispatch queue
它是全局可用的serial queue,它是在应用程序主线程上执行任务的。
/* 队列优先级
#define DISPATCH_QUEUE_PRIORITY_HIGH 高优先级
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 默认优先级
#define DISPATCH_QUEUE_PRIORITY_LOW 低优先级
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND 后台优先级
*/
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);/*创建队列*/
/*创建一个global异步队列*/
dispatch_async(queue, ^{
/*加载数据*/
dispatch_async(dispatch_get_main_queue(), ^{
/*执行主线程更新界面*/
});
});
----------------------------------global 队列---------------------------------------------
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
/*创建一个global类型的队列*/
dispatch_group_t group=dispatch_group_create();
/*创建一个队列组*/
/*global 执行顺序随机*/
dispatch_group_async(group, queue, ^{
NSLog(@"Queue number 1");
});
dispatch_group_async(group, queue, ^{
NSLog(@"Queue number 2");
});
dispatch_group_async(group, queue, ^{
NSLog(@"Queue number 3");
});
dispatch_group_async(group, queue, ^{
NSLog(@"Queue number 4");
});
/*只执行一次在应用中*/
static dispatch_once_t once;
dispatch_once(&once, ^{
NSLog(@"Once 1");
});
dispatch_queue_t queue=dispatch_queue_create("asdbjkhb", DISPATCH_QUEUE_PRIORITY_DEFAULT);
dispatch_async(queue, ^{
NSLog(@"Queue number 1");
});
dispatch_async( queue, ^{
NSLog(@"Queue number 2");
});
dispatch_async(queue, ^{
NSLog(@"Queue number 4");
});
dispatch_async( queue, ^{
NSLog(@"Queue number 3");
});
/*使用队列重复调用10次*/
dispatch_apply(10, queue, ^(size_t index) {
NSLog(@"%zu",index);
if (index>5) {
}
});
/*执行完“前”面队列才进行此队列 所谓的“前”指的就是在此代码创建之前的队列*/
/*使用该队列类型不要创建global类型队列,否则会破坏队列的顺序*/
dispatch_barrier_async(queue, ^{
NSLog(@"Queue number 5");
});