GCD的基本用法

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-1 15:22   38   0

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

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

执行的顺序为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. dispatch_async(queue, ^{
  3. [NSThread sleepForTimeInterval:3];
  4. NSLog(@"dispatch_async1");
  5. });
  6. dispatch_async(queue, ^{
  7. [NSThread sleepForTimeInterval:1];
  8. NSLog(@"dispatch_async2");
  9. });
  10. dispatch_barrier_async(queue, ^{
  11. NSLog(@"dispatch_barrier_async");
  12. [NSThread sleepForTimeInterval:0.5];
  13. });
  14. dispatch_async(queue, ^{
  15. [NSThread sleepForTimeInterval:1];
  16. NSLog(@"dispatch_async3");
  17. });
执行结果为 :2 --1--dispatch_barrier_async---3

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

  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这个函数,它可以保证整个应用程序生命周期中某段代码只被执行一次

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

有时候我们需要等个几秒钟然后做个动画或者给个提示,这时候可以用 dispatch_after这个函数:
  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上。
  1. dispatch_set_target_queue(serialQ, globalQ);




分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP