使用Group實現:先執行一系列操作(在group中),執行完成後再執行別的操作。
1.建立group及任務佇列(目的是讓group中的所有任務執行完再執行別的任務)
dispatch_group_t group = dispatch_group_create(); //建立一個group
dispatch_queue_t globeQ = dispatch_get_global_queue(0, 0); //該方法獲取全域性佇列(每一次得到的都是同一個佇列)
2.提交任務到group
dispatch_group_async(group, globeQ, ^{
usleep(2000000);//休眠時間
NSLog(@"買菜");
//block中的就是一個任務
});//async非同步提交 非同步提交:提交每一個任務不會相互影響
dispatch_group_async(group, globeQ, ^{
//block中的就是一個任務
});//async非同步提交 非同步提交:提交每一個任務不會相互影響
dispatch_group_async(group, globeQ, ^{
usleep(2000000);
NSLog(@"買料");
//block中的就是一個任務
});
dispatch_group_async(group, globeQ, ^{
dispatch_group_async(group, globeQ, ^{
//block中的就是一個任務
// usleep(2000000);
while (1) {
//
// 這樣會導致group卡在這個任務中
}
NSLog(@"買肉");
});
while (1) {
//
// 這樣會導致group卡在這個任務中
}
NSLog(@"買肉");
});
3.提交最終的任務(group中任務完成後,需要執行的任務)
dispatch_queue_t q_1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_SERIAL); //SERIAL序列佇列
dispatch_group_notify(group, q_1, ^{ //等到group中的所有任務執行完成,把該任務加入到佇列q_1
NSLog(@"做火鍋");
NSLog(@"吃火鍋");
});
到這裡已經實現了先執行一系列操作(在group中),執行完成後再執行別的操作。
以下是GCD中關於group的一些用法:
*1.設定超時時間(最大等待時間)
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC));
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC));
dispatch_group_wait(group, time);//如果group內任務執行需要大量的時間,可以選擇設定最大等待時間
NSLog(@"end end end “); //不管group中任務是否執行完畢,等待指定time時間後,執行這一句。
*2.指定time時間後,給佇列新增任務
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC));
dispatch_after(time, q_1, ^{ NSLog(@"waited at least three seconds.%@",[NSThread currentThread]); });//指定time時間後,給佇列q_1新增任務