GCD里面一些剩余的常用的API
dispatch_sync
前面开线程一直用的是dispatch_async,这是代表异步。有异步就有同步,同步就是dispatch_sync。两者区别:async在将指定的Block追加到Dispatch Queue时,不会做任何等待;而sync在将Block追加是,线程会一直等待。调用dispatch_sync函数,在指定的处理执行结束之前,该函数不会返回,会处于等待状态,因此容易产生死锁。
dispatch_sync与dispatch_async用法一样。
dispatch_set_target_queue
这个是用来变更Dispatch Queue的执行优先级的。
平时我们用Global的时候倒是可以直接指定优先级,但当我们用dispatch_queue_create函数生成队列的时候,每一个队列的优先级都是默认优先级的。通过这个函数就能够更改优先级。
dispatch_queue_t myDispatchQueue = dispatch_queue_create("com.wang.MyQueue",NULL);
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
dispatch_set_target_queue(myDispatchQueue,globalQueue);
此函数有两个参数,参数解释:
- 参数一:就是想要变更执行优先级的队列。
- 参数二:要变化到那个优先级的对应队列。
上面即是将myDispatchQueue变更到和globalQueue同一个优先级。
dispatch_after
这个API在项目中很常用。因为经常会有这样的需求:某个任务想要在几秒后执行。这个函数就可以实现。
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,3*NSEC_PER_SEC);
dispatch_after(time,dispatch_get_main_queue(),^{ NSLog(@"3秒后执行");});
只是这个处理的是大致延迟。因为在主线程中,RunLoop每隔1/60秒执行一次,即Block中的任务最快3秒后执行,最慢3秒+1/60秒执行。如果是有严格时间的要求情况下,这种方法就不适用了。
参数解释:
- 参数一:时间,如上面代码那样声明,是dispatch_time_t类型。
- 参数二:要追加处理的队列。
- 参数三:任务Block。
dispatch_once
这也是个非常常用的函数,尤其是单例模式的时候,经常用到它。它能保证在应用程序执行中只执行一次指定处理。能够使之在多线程环境下执行时保证百分之百安全。
+ (instancetype)sharePhotoTool
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharePhotoTool = [[self alloc] init];
});
return sharePhotoTool;
}
Dispatch Group
有时候需多个线程执行完后,再来执行某一个处理,就需用到这个。
如我们将几个任务加入Global队列中,而Global队列是Concurrent队列,几个任务会同时开始。我们要使这些任务全都执行完毕,再在主线程中执行任务,即下面代码:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,queue.^{ NSLog(@"任务1");});
dispatch_group_async(group,queue.^{ NSLog(@"任务2");});
dispatch_group_async(group,queue.^{ NSLog(@"任务3");});
dispatch_group_notify(group,dispatch_get_main_queue(),^{ NSLog(@"最后执行这个主线程里的任务");});