GCD的基本用法

1、DISPATCH_QUEUE_SERIAL   每次运行一个任务,可以添加多个,执行次序FIFO.

  1.  dispatch_async(myQueue, ^{  
  2.         [NSThread sleepForTimeInterval:6];  
  3.         NSLog(@"[NSThread sleepForTimeInterval:6];");  
  4.     });  
  5.       
  6.     dispatch_async(myQueue, ^{  
  7.         [NSThread sleepForTimeInterval:3];  
  8.         NSLog(@"[NSThread sleepForTimeInterval:3];");  
  9.     });  
  10.       
  11.     dispatch_async(myQueue, ^{  
  12.         [NSThread sleepForTimeInterval:1];  
  13.         NSLog(@"[NSThread sleepForTimeInterval:1];");  
  14.     }); 
执行顺序为6--3--1

2、DISPATCH_QUEUE_CONCURRENT  可以同时运行多个任务, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)相同

  1. dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  2.       
  3.     dispatch_async(myQueue, ^{  
  4.         [NSThread sleepForTimeInterval:6];  
  5.         NSLog(@"[NSThread sleepForTimeInterval:6];");  
  6.     });  
  7.       
  8.     dispatch_async(myQueue, ^{  
  9.         [NSThread sleepForTimeInterval:3];  
  10.         NSLog(@"[NSThread sleepForTimeInterval:3];");  
  11.     });  
  12.       
  13.     dispatch_async(myQueue, ^{  
  14.         [NSThread sleepForTimeInterval:1];  
  15.         NSLog(@"[NSThread sleepForTimeInterval:1];");  
  16.     }); 

执行的顺序为1--3--6

二、dispatch_group_async的使用

dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。

  1.  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  2.     dispatch_group_t group = dispatch_group_create();  
  3.     dispatch_group_async(group, queue, ^{  
  4.         [NSThread sleepForTimeInterval:6];  
  5.         NSLog(@"group1 [NSThread sleepForTimeInterval:6];");  
  6.     });  
  7.     dispatch_group_async(group, queue, ^{  
  8.         [NSThread sleepForTimeInterval:3];  
  9.         NSLog(@"group2 [NSThread sleepForTimeInterval:3];");  
  10.     });  
  11.     dispatch_group_async(group, queue, ^{  
  12.         [NSThread sleepForTimeInterval:1];  
  13.         NSLog(@"group3 [NSThread sleepForTimeInterval:1];");  
  14.     });  
  15.     dispatch_group_notify(group, dispatch_get_main_queue(), ^{  
  16.         NSLog(@"main thread.");  
  17.     }); 
执行结果为1--3--6--main thread

dispatch_group_async只会监听最终的结果完成后,并通知main queue

三、

dispatch_barrier_async的使用

dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

  1. dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);  
  2.       
  3.     dispatch_async(queue, ^{  
  4.         [NSThread sleepForTimeInterval:3];  
  5.         NSLog(@"dispatch_async1");  
  6.     });  
  7.     dispatch_async(queue, ^{  
  8.         [NSThread sleepForTimeInterval:1];  
  9.         NSLog(@"dispatch_async2");  
  10.     });  
  11.     dispatch_barrier_async(queue, ^{  
  12.         NSLog(@"dispatch_barrier_async");  
  13.         [NSThread sleepForTimeInterval:0.5];  
  14.           
  15.     });  
  16.     dispatch_async(queue, ^{  
  17.         [NSThread sleepForTimeInterval:1];  
  18.         NSLog(@"dispatch_async3");  
  19.     }); 
执行结果为  :2 --1--dispatch_barrier_async---3

如果使用dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);会发现运行结果为:

[cpp]  view plain copy
  1. 2013-07-24 17:07:17.577 NSThreadAndBlockDemo[2247:12e03] dispatch_barrier_async  
  2. 2013-07-24 17:07:18.579 NSThreadAndBlockDemo[2247:15207] dispatch_async3  
  3. 2013-07-24 17:07:19.578 NSThreadAndBlockDemo[2247:12b03] dispatch_async2  
  4. 2013-07-24 17:07:20.577 NSThreadAndBlockDemo[2247:12303] dispatch_async1  

说明dispatch_barrier_async的顺序执行还是依赖queue的类型啊,必需要queue的类型为dispatch_queue_create创建的,而且attr参数值必需是DISPATCH_QUEUE_CONCURRENT类型,前面两个非dispatch_barrier_async的类型的执行是依赖其本身的执行时间的,如果attr如果是DISPATCH_QUEUE_SERIAL时,那就完全是符合Serial queue的FIFO特征了。

4、dispatch_apply

执行某个代码片段N次。

dispatch_apply(5, globalQ, ^(size_t index) {

// 执行5次

});

5、dispatch_once

     dispatch_once这个函数,它可以保证整个应用程序生命周期中某段代码只被执行一次

[cpp]  view plain copy
  1. static dispatch_once_t onceToken;  
  2.     dispatch_once(&onceToken, ^{  
  3.         // code to be executed once  
  4.     });  
6、dispatch_after

有时候我们需要等个几秒钟然后做个动画或者给个提示,这时候可以用 dispatch_after这个函数:
[cpp]  view plain copy
  1. double delayInSeconds = 2.0;  
  2.     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);  
  3.     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){  
  4.         // code to be executed on the main queue after delay  
  5.     });  

7、dispatch_set_target_queue
通过 dispatch_set_target_queue函数可以设置一个dispatch queue的优先级,或者指定一个dispatch source相应的事件处理提交到哪个queue上。
[cpp]  view plain copy
  1. dispatch_set_target_queue(serialQ, globalQ);  




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值