调度函数:dispatch_group
dispatch_group是GCD(Grand Central Dispatch)中的一组方法,他有一个组的概念,可以把相关的任务归并到一个组内来执行,通过监听组内所有任务的执行情况来做相应处理。
dispatch_group调度组:分别异步执行2个耗时任务,然后当2个耗时任务都执行完毕后再回到主线程执行任务。这时候我们可以用到GCD的dispatch_group。
来看下dispatch_group中的几个重要函数
-
dispatch_group_creat
:创建函数 -
dispatch_group_async
把异步任务提交到指定任务组和指定下拿出队列执行
/*!@function dispatch_group_async 函数说明
* @abstract
* 把block任务块添加到队列中,并关联到给定的调度组
* @param group 关联的调度组
* @param queue block任务提交的队列
* @param block 任务块
*/
dispatch_group_async(dispatch_group_t group,
dispatch_queue_t queue,
dispatch_block_t block);
-
dispatch_group_enter & dispatch_group_leave
调用这个方法标志着一个代码块被加入了group,和dispatch_group_async功能类似;dispatch_group_enter()、dispatch_group_leave()必须成对出现。
dispatch_queue_t queue2 = dispatch_queue_create("group.elaine.yin", DISPATCH_QUEUE_SERIAL);
dispatch_group_enter(group);
dispatch_async(queue2, ^{
//加入到queue队列执行的block块
NSLog(@"test2");
dispatch_group_leave(group);
});
-
dispatch_group_notify
待调度组执行完毕时调用,不会阻塞当前线程,比如当任务全部执行完成之后,在主线程更新UI,这样使用
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//更新UI
});
-
dispatch_wait
和dispatch_group_notify
功能类似(多了一个dispatch_time_t
参数可以设置超时时间),在group上任务完成前,dispatch_group_wait
会阻塞当前线程(所以不能放在主线程调用)一直等待;
当group上任务完成,或者等待时间超过设置的超时时间会结束等待;执行完成返回0,未执行完毕返回非0。
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSInteger result = dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC));
if (result == 0) {
NSLog(@"加入到group的任务能在5秒之内执行完毕");
} else {
NSLog(@"加入到group的任务不能在5秒之内执行完毕");
}
});
注意
dispatch_group_wait
是同步的所以不能放在主线程执行。
Code Test
- (void)groupTest {
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, queue1, ^{
[NSThread sleepForTimeInterval:5];
//加入到queue队列执行的block块
NSLog(@"test1");
});
dispatch_queue_t queue2 = dispatch_queue_create("group.elaine.yin", DISPATCH_QUEUE_SERIAL);
//调用这个方法标志着一个代码块被加入了group,和dispatch_group_async功能类似;dispatch_group_enter()、dispatch_group_leave()必须成对出现
dispatch_group_enter(group);
dispatch_async(queue2, ^{
//加入到queue队列执行的block块
NSLog(@"test2");
dispatch_group_leave(group);
});
//dispatch_group_notify
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"所有任务全部执行完毕,更新UI");
});
/*
dispatch_group_wait函数说明
和dispatch_group_notify功能类似(多了一个dispatch_time_t参数可以设置超时时间),在group上任务完成前,dispatch_group_wait会阻塞当前线程(所以不能放在主线程调用)一直等待;当group上任务完成,或者等待时间超过设置的超时时间会结束等待;执行完成返回0,未执行完毕返回非0
dispatch_group_wait是同步的所以不能放在主线程执行。
*/
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSInteger result = dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC));
if (result == 0) {
NSLog(@"加入到group的任务能在5秒之内执行完毕");
} else {
NSLog(@"加入到group的任务不能在5秒之内执行完毕");
}
});
}