dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);
该函数的第一个参数指定Serial Dispatch Queue的名称。推荐使用应用程序ID这种逆序全程域名。
第二个参数,当生成Serial Dispatch Queue时,第二个参数设置NULL。
当生成Concurrent Dispatch Queue,指定为DISPATCH_QUEUE_CONCURRENT
dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_suspend
//挂起指定的Dispatch Queue.
dispatch_suspend(queue)
dispatch_resume
//恢复指定的Dispatch Queue
dispatch_resume(queue)
dispatch_apply
//该函数按指定的次数将指定的Block追加到指定的Dispatch Queue中,并等待全部处理执行结束。
dispatch_queue_t queue = dispatch_get_global_queu(0, 0);
dispatch_apply(10, queue, ^(size_t index){
NSLog(@"%zu", index);
});
NSLog(@"done");
NSArray *array = @[@"1", @"2", @"3", @"4", @"5", @"6"];
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
dispatch_apply([array count], queue, ^(size_t index) {
NSLog(@"%zu : %@", index, [array objectAtIndex:index]);
});
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"currentThread = %@", [NSThread currentThread]);
NSLog(@"done");
});
});
dispatch_once
//常用于单例
//dispatch_once 函数是保证在应用程序执行中只执行一次指定处理的API
//通过dispatch_once函数,即使在多线程环境下执行,也可能百分之百安全。
static dispatch_once_t pred;
dispatch_once(&pred, ^{
/*
*初始化
*/
});
dispatch队列还实现其它一些常用函数,包括:
__void dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t)); __
//重复执行block,需要注意的是这个方法是同步返回,也就是说等到所有block执行完毕才返回,如需异步返回则嵌套在dispatch_async中来使用。多个block的运行是否并发或串行执行也依赖queue的是否并发或串行。
__void dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block); __
//这个函数可以设置同步执行的block,它会等到在它加入队列之前的block执行完毕后,才开始执行。在它之后加入队列的block,则等到这个block执行完毕后才开始执行。
__void dispatch_barrier_sync(dispatch_queue_t queue, dispatch_block_t block); __
//同上,除了它是同步返回函数
__void dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block); __
//延迟执行block
最后再来看看dispatch队列的一个很有特色的函数:
__void dispatch_set_target_queue(dispatch_object_t object, dispatch_queue_t queue); __
它会把需要执行的任务对象指定到不同的队列中去处理,这个任务对象可以是dispatch队列,也可以是dispatch源(以后博文会介绍)。而且这个过程可以是动态的,可以实现队列的动态调度管理等等。比如说有两个队列dispatchA和dispatchB,这时把dispatchA指派到dispatchB:
dispatch_set_target_queue(dispatchA, dispatchB);
那么dispatchA上还未运行的block会在dispatchB上运行。这时如果暂停dispatchA运行:
dispatch_suspend(dispatchA);
则只会暂停dispatchA上原来的block的执行,dispatchB的block则不受影响。而如果暂停dispatchB的运行,则会暂停dispatchA的运行。