三种queue

三种queue

 

转载自 : http://blog.csdn.net/ericsuper/article/details/6998856

 

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

 

 

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

dispatch Queuesserial Queues 也被称为私有dispatch Queues

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

 

 

Cpp代码   收藏代码
  1. dispatch_queue_t queue;  
  2. 
queue = dispatch_queue_create("myQueue", NULL);    
  3. dispatch_async(queue, ^{
          
  4.     printf("Do some work here.\n");
      
  5. });
   
  6.      
  7. printf("The first block may or may not have run.\n");
     
  8. dispatch_sync(queue, ^{
          
  9.     printf("Do some more work here.\n");
      
  10. });
      
  11. printf("Both blocks have completed.\n");  
 

 

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

 

 

2.并发队列:Concurrent Queues

 

 

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

 

 

Cpp代码   收藏代码
  1. dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  2. dispatch_queue_t aHQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
  
  3. dispatch_queue_t aLQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);  
 

 

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

 

 

3.主队列:main dispatch Queue 

 

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

 

 

Cpp代码   收藏代码
  1. dispatch_queue_t mainQueue = dispatch_get_main_queue();  
 

 

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

 

 

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

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

 

Cpp代码   收藏代码
  1. -(void)sixthMethod{  
  2.     //获取concurrent queue  
  3.     dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  4.     //创建1个queue group  
  5.     dispatch_group_t queueGroup = dispatch_group_create();  
  6.     //任务1  
  7.     dispatch_group_async(queueGroup, aQueue, ^{  
  8.         NSLog(@"task 1.");  
  9.     });  
  10.     //任务2  
  11.     dispatch_group_async(queueGroup, aQueue, ^{  
  12.         NSLog(@"task 2.");  
  13.     });  
  14.     //任务3  
  15.     dispatch_group_async(queueGroup, aQueue, ^{  
  16.         NSLog(@"task 3.");  
  17.     });  
  18.     NSLog(@"wait task 1,2,3.");  
  19.     //等待组内任务全部完成  
  20.     dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);  
  21.     NSLog(@"task 1,2,3 finished.");  
  22.     //释放组  
  23.     dispatch_release(queueGroup);  
  24.     //重新创建组  
  25.     queueGroup = dispatch_group_create();  
  26.     //任务4  
  27.     dispatch_group_async(queueGroup, aQueue, ^{  
  28.         NSLog(@"task 4.");  
  29.     });  
  30.     //任务5  
  31.     dispatch_group_async(queueGroup, aQueue, ^{  
  32.         NSLog(@"task 5.");  
  33.     });  
  34.     //任务6  
  35.     dispatch_group_async(queueGroup, aQueue, ^{  
  36.         NSLog(@"task 6.");  
  37.     });  
  38.     NSLog(@"wait task 4,5,6.");  
  39.     //等待组内任务全部完成  
  40.     dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);  
  41.     NSLog(@"task 4,5,6 finished.");  
  42.     //释放组  
  43.     dispatch_release(queueGroup);  
  44. }  
 
代码运行结果:

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值