這個方法主要和下面幾個方法一起使用的:
- dispatch_group_enter
- dispatch_group_leave
- dispatch_group_notify
- dispatch_group_wait
dispatch_group_enter 和 dispatch_group_leave 一般是成對出現(xiàn)的, 進(jìn)入一次,就得離開一次。也就是說,當(dāng)離開和進(jìn)入的次數(shù)相同時,就代表任務(wù)組完成了。如果enter比leave多,那就是沒完成,如果leave調(diào)用的次數(shù)多了, 會崩潰的;
看如下代碼:
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
[self test];
});
}
- (void)test
{
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_group_enter(group);
NSLog(@"加入");
NSLog(@"加入");
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 異步2秒后離開
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), queue, ^{
NSLog(@"即將離開 - 1");
dispatch_group_leave(group);
NSLog(@"已經(jīng)離開 - 1");
});
// 異步3秒后離開
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), queue, ^{
NSLog(@"即將離開 - 2");
dispatch_group_leave(group);
NSLog(@"已經(jīng)離開 - 2");
});
dispatch_group_notify(group, queue, ^{
NSLog(@"都完成了");
});
NSLog(@"開始等待");
dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)));
NSLog(@"等待結(jié)束");
}
打印的結(jié)果是:
2018-03-19 11:55:59.077862+0800 Test[26326:1160676] 加入
2018-03-19 11:55:59.078010+0800 Test[26326:1160676] 加入
2018-03-19 11:55:59.078649+0800 Test[26326:1160676] 開始等待
2018-03-19 11:56:01.187318+0800 Test[26326:1160674] 即將離開 - 1
2018-03-19 11:56:01.187573+0800 Test[26326:1160674] 已經(jīng)離開 - 1
2018-03-19 11:56:02.377367+0800 Test[26326:1160674] 即將離開 - 2
2018-03-19 11:56:02.377703+0800 Test[26326:1160674] 已經(jīng)離開 - 2
2018-03-19 11:56:02.377732+0800 Test[26326:1160676] 等待結(jié)束
2018-03-19 11:56:02.377755+0800 Test[26326:1160681] 都完成了
dispatch_group_wait :在任務(wù)組完成時調(diào)用,或者任務(wù)組超時是調(diào)用(完成指的是enter和leave次數(shù)一樣多)
dispatch_group_notify:不管超不超時,只要任務(wù)組完成,會調(diào)用,不完成不會調(diào)用
上面代碼,enter了兩次,wait是會阻塞當(dāng)前線程的,wait時間為6秒, 在6秒內(nèi)leave了兩次, 當(dāng)最后一次leave的時候,wait就會執(zhí)行(打開阻塞), 繼續(xù)往下執(zhí)行;NSLog(@"已經(jīng)離開 - 2"); 和NSLog(@"等待結(jié)束");是異步進(jìn)行的;誰先誰后不一定;
最后一次的dispatch_group_leave(group);執(zhí)行完之后,dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)));這條代碼的阻塞就立即打開了,然后往下執(zhí)行