dispath_group用来实现依赖, 等多个任务完成后, 在执行下一步。
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("com.gcd-group.www", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_async(group, queue, ^{
for (int i = 0; i < 10; i++) {
sleep(200);
if (i == 9) {
NSLog(@"task a");
}
}
});
dispatch_group_async(group, queue, ^{
NSLog(@"task b");
});
dispatch_group_async(group, queue, ^{
NSLog(@"task c");
});
dispatch_group_notify(group, queue, ^{
NSLog(@"done");
});
执行结果:
task a
task b
task c
done
dispatch_barrier用来在并行队列中的部分任务进行阻塞,确保该任务不会与其他任务并行,进而在实现线程安全的同时,达到更高的效率。
- (id)objectAtIndex:(NSUInteger)index {
__block id obj;
dispatch_sync(self.concurrent_queue,^{
obj = [self.array objectAtIndex:index];
});
return obj;
}
- (void)insertObject:(id)obj atIndex:(NSUInteger)index {
dispatch_barrier_async(self.concurrent_queue,^{
[self.array insertObject:obj atIndex:index];
});
}
读的时候由于需要立刻返回结果, 因此应该用同步调度。 这样在不同线程中调用读方法,就可以实现多线程并发。
写的时候由于有栅栏的保护, 在开始执行写任务时,并发队列中的其他任务会等该任务执行完后再执行,可以避免写冲突,保证线程安全。