Dispatch Queue即 执行处理的等待队列。
存在两种Dispatch Queue,即
Serial Dispatch Queue 等待现在的处理(串行队列)
Concurrent Dispatch Queue 不等待现在的处理(并发队列)并行处理的数量取决于当前系统的状态,不能像operationQueue一样设置最大数量。
1.dispatch_queue_create("com.gcd.test",Null)
创建Dispatch queue,都是Default Priority
DISPATCH_QUEUE_SERIAL
DISPATCH_QUEUE_CONCURRENT
- (void)tsGCD
{
dispatch_queue_t queue = dispatch_queue_create("com.gcd.test", DISPATCH_QUEUE_CONCURRENT);
NSMutableArray *array = [[NSMutableArray alloc]init];
for (int i = 0; i < 100000; i++) {
dispatch_async(queue, ^{
[array addObject:[NSNumber numberWithInt:i]];
});
}
NSLog(@"done");
}
当为DISPATCH_QUEUE_CONCURRENT,数组AddObject非线程安全,同时访问容易引起问题,
gcdTest(2484,0x11395b000) malloc: *** error for object 0x7f9c8b802e00: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
当为DISPATCH_QUEUE_SERIAL时,线程有序进行,不会引起并发问题。
系统提供两种快速获取的Dispatch Queue,
Main Dispatch Queue (主线程,是 Serial Dispatch Queue)
Global Dispatch Queue (Concurrent Dispatch Queue)
Global Dispatch Queue 提供4个执行优先级,HIGH DEFAULT LOW BACKGROUND
2.dispatch_get_main_queue();
3.dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);
4.dispatch_set_target_queue(destinqueue,fromqueue);
1.改变dispatch queue 执行优先级
2.多个Serial Dispatch Queue 防止并行执行,实现Dispatch Queue 的执行阶层。
5.dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,3ull*NSEC_PER_SEC);
dispatch_after(time,queue);
并不是在指定时间后执行处理,而只是在指定时间追加处理到Dispatch queue
6.dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,queue,^{NSLog(@"blk0");});
dispatch_group_notify(group,dispatch_get_main_queue(),^{NSLog(@"done");});
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,3ull*NSEC_PER_SEC);
dispatch_group_wait(group,time);可以通过返回值判断指定时间后group是否结束。
追加到Dispatch Queue 中的多个处理全部结束后想执行结束处理。
7.dispatch_barrier_async
dispatch_barrier_sync
障碍
8.dispatch_sync(queue,block)
dispatch_async(queue,block)
执行queue