三种queue

 


1.串行队列:Dispatch Queues或者 Serial Queues 

 

 

Dispatch Queues从使用的角度讲更象另一种形式的Operation Queues,只是 Operation Queuse是用ObjectC的,Dispatch Queues是C的。

dispatch Queues,serial Queues 也被称为私有dispatch Queues。

需要自己手工创建运行,一个时间只能运行一个task,顺序运行。

 

 

dispatch_queue_t queue;

queue = dispatch_queue_create("myQueue", NULL);  
dispatch_async(queue, ^{
        
    printf("Do some work here.\n");
    
});
 
   
printf("The first block may or may not have run.\n");
   
dispatch_sync(queue, ^{
        
    printf("Do some more work here.\n");
    
});
    
printf("Both blocks have completed.\n");

 

这里使用了同步dispatch和异步dispatch,推荐使用dispatch_async这样才能真正体现其中的优势同步相当于WaitUntil =

 

 

2.并发队列:Concurrent Queues

 

 

每个程序系统自动提供了3个Concurrent Queues,无需自己创建,可以直接使用。

 

 

dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t aHQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

dispatch_queue_t aLQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);

 

啥意思一看就明白,3个优先级别的concurrent queues。

 

 

3.主队列:main dispatch Queue 

 

main dispatch Queue 也是程序启动自动生成,无需自己创建,可以直接使用。

 

 

dispatch_queue_t mainQueue = dispatch_get_main_queue();

 

针对以上3种队列:concurrent queues和main queue 都是由系统生成而且 dispatch_suspend, dispatch_resume, dispatch_set_context这些函数对他们无效。

 

 

但是我们的应用不是简单的同步也异步的运行,应用经常是混合的。

比如我们要task1 task2 task3 都运行完成后才能异步运行task4 task5 task6我们该怎么做呢?这里我们可以引入group的概念。

 

-(void)sixthMethod{
	//获取concurrent queue
	dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
	//创建1个queue group
	dispatch_group_t queueGroup = dispatch_group_create();
	//任务1
	dispatch_group_async(queueGroup, aQueue, ^{
		NSLog(@"task 1.");
	});
	//任务2
	dispatch_group_async(queueGroup, aQueue, ^{
		NSLog(@"task 2.");
	});
	//任务3
	dispatch_group_async(queueGroup, aQueue, ^{
		NSLog(@"task 3.");
	});
	NSLog(@"wait task 1,2,3.");
	//等待组内任务全部完成
	dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);
	NSLog(@"task 1,2,3 finished.");
	//释放组
	dispatch_release(queueGroup);
	//重新创建组
	queueGroup = dispatch_group_create();
	//任务4
	dispatch_group_async(queueGroup, aQueue, ^{
		NSLog(@"task 4.");
	});
	//任务5
	dispatch_group_async(queueGroup, aQueue, ^{
		NSLog(@"task 5.");
	});
	//任务6
	dispatch_group_async(queueGroup, aQueue, ^{
		NSLog(@"task 6.");
	});
	NSLog(@"wait task 4,5,6.");
	//等待组内任务全部完成
	dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);
	NSLog(@"task 4,5,6 finished.");
	//释放组
	dispatch_release(queueGroup);
}

 

代码运行结果:


2012-04-11 16:47:22.294 Test04[2570:9203] wait task 1,2,3.

2012-04-11 16:47:22.294 Test04[2570:e103] task 1.

2012-04-11 16:47:22.294 Test04[2570:e203] task 2.

2012-04-11 16:47:22.296 Test04[2570:e103] task 3.

2012-04-11 16:47:22.298 Test04[2570:9203] task 1,2,3 finished.

2012-04-11 16:47:22.299 Test04[2570:9203] wait task 4,5,6.

2012-04-11 16:47:22.299 Test04[2570:e103] task 4.

2012-04-11 16:47:22.299 Test04[2570:e203] task 5.

2012-04-11 16:47:22.300 Test04[2570:e103] task 6.

2012-04-11 16:47:22.301 Test04[2570:9203] task 4,5,6 finished.