Dispatch Queue
Serial Dispatch Queue
:依次执行,等待现在执行中处理结束Concurrent Dispatch Queue
: 并发执行,不等待现在执行中处理结束
Dispatch Queue 种类
1 | // serial dispatch queue |
dispatch_set_target_queue
dispatch_queue_create
生成的队列都是具有默认有优先级,因此变更队列的优先级使用dispatch_set_target_queue
。将不可并行执行的处理追加到多个Serial Dispatch Queue
中时,如果使用dispatch_set_target_queue
函数指定为某一个Serial Dispatch Queue
,则可以防止处理并行执行。
注意:
第一个参数如果指定为Main Dispatch Queue
和Global Dispatch Queue
则不知道会出现什么情况,因此这些均不可指定。
1 | dispatch_queue_t serialDispatchQueue = dispatch_queue_create("com.serial", NULL); |
dispatch_after
使用dispatch_after
延时将Block追加到Main Dispatch Queue
中处理。
1 | dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull * NSEC_PER_SEC); |
Dispatch Group
在追加多个Dispatch Queue中的多个处理全部结束后想执行结束处理,使用Dispatch Group。
1 | dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); |
dispatch_barrier_async
使用dispatch_barrier_async
来避免读写数据库导致的竞争。使用Concurrent Dispatch Queue
和dispatch_barrier_async
可以实现高效率的数据库访问和文件访问。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15dispatch_queue_t queue = dispatch_queue_create("com.gcd.concureent", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{NSLog(@"blk0_for_reading");});
dispatch_async(queue, ^{NSLog(@"blk1_for_reading");});
dispatch_async(queue, ^{NSLog(@"blk2_for_reading");});
dispatch_barrier_async(queue, ^{NSLog(@"blk2_for_writing");});
dispatch_async(queue, ^{NSLog(@"blk3_for_reading");});
dispatch_async(queue, ^{NSLog(@"blk4_for_reading");});
// output
// blk0_for_reading
// blk1_for_reading
// blk2_for_reading
// blk2_for_writing
// blk3_for_reading
// blk4_for_reading