GCD中栅栏函数的调用?作用?注意事项?
2017-02-16 本文已影响23人
随心吧
一、需求:
当开发中,需要开启 多个
任务,同时需要控制前几个任务和后几个任务的顺序
,该怎么办?
二、方法:
可以使用GCD的栅栏函数控制任务的顺序。dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
三、注意事项:
- 队列:
队列为并发队列,这个queue
不能是(dispatch_get_global_queue)
全局的并发队列,所以是用新创建的并发队列dispatch_queue_create
- 函数:
必须为异步函数async
,同步函数sync
没有意义。 - 结果:
在前面的任务执行结束后它(栅栏函数)才执行,而且它后面的任务等它执行完成之后才会执行(它前面任务顺序不能控制,它后面的顺序也不能控制)
四、代码示例:
1.封装方法asyncBarriCreatGCD
//栅栏函数
[self asyncBarriCreatGCD];
2.方法内容
-(void)asyncBarriCreatGCD
{
// 0 获取全局并发队列
// 栅栏函数不嫩更实用全局并发队列
dispatch_queue_t queue = dispatch_queue_create("asycBarri",DISPATCH_QUEUE_CONCURRENT );
//1 异步函数
dispatch_async(queue, ^{
NSLog(@"asyncBarriCreatGCD_1 = %@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"asyncBarriCreatGCD_2 = %@",[NSThread currentThread]);
});
//2 栅栏函数
dispatch_barrier_sync(queue, ^{
NSLog(@"--------------");
});
dispatch_async(queue, ^{
NSLog(@"asyncBarriCreatGCD_3 = %@",[NSThread currentThread]);
});
3.打印结果
/* 结果:任务3在任务2+1的后面,但是1&2的顺序无法控制
2017-02-16 13:07:22.559 01-掌握-GCD-栅栏函数[1005:46700] asyncBarriCreatGCD_2 = <NSThread: 0x60800026e280>{number = 4, name = (null)}
2017-02-16 13:07:22.559 01-掌握-GCD-栅栏函数[1005:46703] asyncBarriCreatGCD_1 = <NSThread: 0x608000261c80>{number = 3, name = (null)}
2017-02-16 13:07:22.559 01-掌握-GCD-栅栏函数[1005:46604] --------------
2017-02-16 13:07:22.559 01-掌握-GCD-栅栏函数[1005:46703] asyncBarriCreatGCD_3 = <NSThread: 0x608000261c80>{number = 3, name = (null)}
分析:任务1(asyncBarriCreatGCD_1)和2(asyncBarriCreatGCD_2)分别在前面执行,栅栏函数执行-----,最后执行任务3(asyncBarriCreatGCD_3)
*/
}