多线程07——CGD栅栏函数、延时、一次性代码
一、说明
1.1 栅栏函数说明
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
在前面的任务执行结束后它才执行,除此之外只有它本身执行完了,它后面的任才能被执行
示例代码
dispatch_barrier_async(queue, ^{
NSLog(@"++++++++++++++++++++++++++++++");
});
1.2 延时执行
dispatch_after(dispatch_time_t when,
dispatch_queue_t queue,
dispatch_block_t block);
可以使用已经内置的代码模板
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<delayInSeconds> * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
<code to be executed after a specified delay>
});
使用说明
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//2秒钟后执行的代码。。。。。。
});
1.3 一次性代码
使用 dispatch_once 函数能保证某段代码在程序运行过程中只被执行1次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 只执行1次的代码(这里面默认是线程安全的)
});
二、栅栏函数
2.1 说明
我们创建四个任务。在栅栏函数前面创建两个 ,栅栏函数后面创建两个。我们得到的结果应该是:
- 先执行前面两个任务,执行完了到第2步
- 执行栅栏函数,执行完了到第3步
- 执行后面的两个任务
2.2 代码
/*栅栏函数*/
-(void)barrier{
dispatch_queue_t queue = dispatch_queue_create("com.wiming", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
for (int i=0; i<5; i++) {
NSLog(@"download1--%zd---%@",i,[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i=0; i<5; i++) {
NSLog(@"download2--%zd---%@",i,[NSThread currentThread]);
}
});
dispatch_barrier_async(queue, ^{
NSLog(@"++++++++++++++++++++++++++++++");
});
dispatch_async(queue, ^{
for (int i=0; i<5; i++) {
NSLog(@"download3--%zd---%@",i,[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i=0; i<5; i++) {
NSLog(@"download4--%zd---%@",i,[NSThread currentThread]);
}
});
}
2.3 结果
[72846:415833] download1--0---<NSThread: 0x600000076b00>{number = 4, name = (null)}
[72846:415834] download2-