1.dispatch_async
适用场景:后台异步执行一些耗时任务,或后台任务完成后更新UI,
适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue
2.dispatch_after
适用场景:延时执行任务,使用起来就像延时的dispatch_async。既不能控制任务的准确开始执行时间,一旦dispatch_after返回后,也不能取消任务。
适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue
示例:double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
//task
});
3.dispatch_once
适用场景:线程安全的执行且仅执行一次代码,常用来确保生成单例
适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue
示例:+ (instancetype)sharedInstance
{
static id *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
4.dispatch barriers
适用场景:一组用于在并发队列中实现串行访问的函数,可用于实现读写锁。使用dispatch barriers函数可以保证在某个队列的某个特定时间,只有唯一一个任务运行。GCD提供了同步和异步两种 barrier函数。
适用队列:Global Concurrent Queue,Custom Concurrent Queue
示例:dispatch_barrier_async(self.concurrentPhotoQueue, ^{
//task
dispatch_async(dispatch_get_main_queue(), ^{
//update UI
});
});
5.dispatch_sync
适用场景:同步执行任务
适用队列:Main Queue (Serial),Concurrent Queue
6.dispatch groups
适用场景:dispatch groups可以在一组任务完成之后通知用户。这些任务可以是同步的,也可以是异步的,甚至可以处在不同的队列之中。dispatch groups任务完成之后的通知方式有同步和异步两种,可以通过dispatch_group_t引用跟踪管理不同队列中的任务。
适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue
示例:
同步通知方式- dispatch_group_t downloadGroup = dispatch_group_create();
dispatch_group_enter(downloadGroup);
//task
dispatch_group_leave(downloadGroup);
...
dispatch_group_wait(downloadGroup, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_main_queue(), ^{
if (completionBlock) {
completionBlock(error);
}
});
异步通知方式- dispatch_group_t downloadGroup = dispatch_group_create();
dispatch_group_enter(downloadGroup);
//task
dispatch_group_leave(downloadGroup);
...
dispatch_group_notify(downloadGroup, dispatch_get_main_queue(), ^{
if (completionBlock) {
completionBlock(error);
}
});
7.dispatch_apply
适用场景:dispatch_apply功能与for循环一致,不同之处在于dispatch_apply可以并发执行多个循环。dispatch_apply是同步函数,因此与for循环一样,只有所以循环全部完成后才会返回。
适用队列:Concurrent Queue
示例:dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) {
switch (i) {
case 0:
break;
case 1:
break;
case 2:
break;
default:
break;
}
});
8.dispatch semaphore
适用场景:使用semaphore可以控制在资源有限的情况下,同时访问资源的消费者数量。可以用来阻塞线程。
适用队列:Custom Serial Queue,Main Queue (Serial),Concurrent Queue
示例:dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
//task
dispatch_semaphore_signal(semaphore);
dispatch_time_t timeoutTime = dispatch_time(DISPATCH_TIME_NOW, kDefaultTimeoutLengthInNanoSeconds);
if (dispatch_semaphore_wait(semaphore, timeoutTime)) {
}
9.dispatch source
不常用。。。