iOS-GCD多线程编程详解3
接着GCD多线程编程详解系列,今天主要对dispatch_after,dispatch_barrier_async的使用。
一.dispatch_after的使用
void
dispatch_after(dispatch_time_t when,
dispatch_queue_t queue,
dispatch_block_t block);
函数功能说明:这函数的主要作用是提交block到queue派送队列中,该block不是马上执行而是在规定的时间when执行,不如现在往后5秒执行就是现在的时间加上5秒钟。
返回值为空
参数说明:
when:说明什么使用执行block块,如果你填入现在执行的时间DISPATCH_TIME_NOW的话,就会被编译器优化为dispatch_async,如果你填入DISPATCH_TIME_FOREVER,block块永远也不会执行,或者呗编译器优化掉,通常时间使用dispatch_time() 和dispatch_walltime()这两个函数来制定运行的时间。
queue:block提交到的执行队列
block:执行的任务块
dispatch_time的使用:
dispatch_time(DISPATCH_TIME_NOW, 1)这样表示现在之后的十亿分之一秒,如果你想要dispatch_after中的block在5秒钟后运行,when参数就位
dispatch_time(DISPATCH_TIME_NOW,5*1000000000)或者dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 *NSEC_PER_SEC))其中NSEC_PER_SEC表示十亿,其中运行不可能达到结对的精确,会存在少许偏差。
NSDate *before = [NSDate date];
NSLog(@"%@",before);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"dispatch after");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@",[NSDate date]);
});
});
运行结果:
2015-01-06 23:20:43.723 GCDTest[833:41121] 2015-01-06 15:20:43 +0000
2015-01-06 23:20:49.221 GCDTest[833:41121] dispatch after
2015-01-06 23:20:49.221 GCDTest[833:41121] 2015-01-06 15:20:49 +0000
除去误差和输出的时间大概就是5秒左右。二.dispatch_barrier_async的使用
void
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
函数说明:单纯的从名字来说就是一个拦路的block,这个队列在这个block之前加入的block运行完成之后在运行这个block,这个block运行完成之后才运行后面的block。
API的说明翻译:该函数是给queue提交一个看门的block,相比同步和异步调用,它用于读写操作还是要更有效率,特别要注意的是该函数只对属性为
DISPATCH_QUEUE_CONCURRENT的队列有效,只有block被调用之后后面被加入的才被执行,如果改队列是通过dispatch_get_global_queue()或者是非DISPATCH_QUEUE_CONCURRENT队列的话,该函数的执行效果和dispatch_async()/dispatch_sync()一样。
参数说明:
queue:block被提交的队列,改队列是DISPATCH_QUEUE_CONCURRENT的才有效,否则该函数和同步调用异步调用没有什么区别。
block:被提交的任务block
使用情况:
dispatch_queue_t que = dispatch_queue_create("", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(que, ^{
NSLog(@"block1");
});
dispatch_async(que, ^{
NSLog(@"block2");
});
dispatch_async(que, ^{
NSLog(@"block3");
});
dispatch_barrier_async(que, ^{
NSLog(@"你好我是barrier block");
});
dispatch_async(que, ^{
NSLog(@"block4");
});
dispatch_async(que, ^{
NSLog(@"block5");
});
dispatch_async(que, ^{
NSLog(@"block6");
});
运行结果:
1:
2015-01-06 23:44:03.217 GCDTest[863:48123] block1
2015-01-06 23:44:03.217 GCDTest[863:48124] block2
2015-01-06 23:44:03.217 GCDTest[863:48122] block3
2015-01-06 23:44:03.218 GCDTest[863:48122]你好我是barrier block
2015-01-06 23:44:03.218 GCDTest[863:48124] block5
2015-01-06 23:44:03.218 GCDTest[863:48124] block6
2015-01-06 23:44:03.219 GCDTest[863:48122] block4
2.2015-01-06 23:45:23.194 GCDTest[877:48936] block2
2015-01-06 23:45:23.194 GCDTest[877:48933] block1
2015-01-06 23:45:23.194 GCDTest[877:48934] block3
2015-01-06 23:45:23.195 GCDTest[877:48934]你好我是barrier block
2015-01-06 23:45:23.195 GCDTest[877:48934] block4
2015-01-06 23:45:23.195 GCDTest[877:48934] block5
2015-01-06 23:45:23.196 GCDTest[877:48934] block6
3.2015-01-06 23:45:47.709 GCDTest[882:49217] block1
2015-01-06 23:45:47.709 GCDTest[882:49214] block3
2015-01-06 23:45:47.709 GCDTest[882:49215] block2
2015-01-06 23:45:47.710 GCDTest[882:49215]你好我是barrier block
2015-01-06 23:45:47.710 GCDTest[882:49214] block5
2015-01-06 23:45:47.710 GCDTest[882:49214] block6
2015-01-06 23:45:47.710 GCDTest[882:49215] block4
结果分析:barrier block的执行顺序都没有变,其他的都是并发执行,如果加入的队列是顺序队列的话,就会按照加入的先后顺序执行说明图解如下:
下一张将会讲到dispatch_group及和本章的合用。