二者因为是sync提交,所以都是阻塞当前提交Block线程。
而它俩唯一的区别是:dispatch_sync
并不能阻塞并行队列。
dispatch_queue_t queue = dispatch_queue_create("com.yahui.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
dispatch_async(queue, ^{
NSLog(@"任务二");
});
dispatch_async(queue, ^{
NSLog(@"任务三");
});
//睡眠2秒
[NSThread sleepForTimeInterval:2];
NSLog(@"任务一");
});
输出结果 :
任务三
任务二
任务一
很显然,并行队列没有被sync所阻塞。
而dispatch_barrier_sync
可以阻塞并行队列(栅栏作用的体现):
dispatch_queue_t queue = dispatch_queue_create("com.yahui.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_barrier_sync(queue, ^{
dispatch_async(queue, ^{
NSLog(@"任务二");
});
dispatch_async(queue, ^{
NSLog(@"任务三");
});
//睡眠2秒
[NSThread sleepForTimeInterval:2];
NSLog(@"任务一");
});
输出结果 :
任务一
任务二
任务三
如果上述结果看不明白请参考:dispatch_group_t和dispatch_barrier_async 同步多线程任务