假設(shè)有一個頁面有多個下載文件的需求,這個時候如果要執(zhí)行多個下載文件的任務(wù)玛歌,這些耗時的任務(wù)會被放到多個線程上異步執(zhí)行昧港,直到全部的文件下載完成,彈出一個提示框來通知用戶文件已下載完成支子。這個時候就需要用到我們的隊列組的功能.
下面開始描述隊列組的基本的使用.
1.創(chuàng)建一個隊列組
dispatch_group_t fGroup = dispatch_group_create();
2.創(chuàng)建隊列并添加任務(wù).
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_async(fGroup, queue, ^{
for (int i = 0; i<5; i++) {
NSLog(@"1111-%d --- %@", i, [NSThread currentThread]);
}
});
3.添加通知的處理(所有的任務(wù)都執(zhí)行完成后的回調(diào).)
dispatch_group_notify(fGroup, queue, ^{
NSLog(@"都執(zhí)行完啦");
});
上述代碼整合如下
NSLog(@"開始了");
dispatch_group_t fGroup = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_async(fGroup, queue, ^{
for (int i = 0; i<5; i++) {
NSLog(@"1111-%d --- %@", i, [NSThread currentThread]);
}
for (int i = 0; i<5; i++) {
NSLog(@"2222-%d --- %@", i, [NSThread currentThread]);
}
});
dispatch_group_async(fGroup, queue, ^{
for (int i = 0; i<5; i++) {
NSLog(@"3333-%d --- %@", i, [NSThread currentThread]);
}
for (int i = 0; i<5; i++) {
NSLog(@"4444-%d --- %@", i, [NSThread currentThread]);
}
});
dispatch_group_notify(fGroup, queue, ^{
// 所有的任務(wù)都執(zhí)行完成后的回調(diào).
NSLog(@"都執(zhí)行完啦");
});
NSLog(@"結(jié)束了");
注意: 以上代碼中 任務(wù),有局限性,并不能解決實際開發(fā)中的網(wǎng)絡(luò)請求任務(wù).因為我們發(fā)起了網(wǎng)絡(luò)請求,上面的任務(wù)block就會認(rèn)為任務(wù)執(zhí)行完成了,然而實際開發(fā)中,只要網(wǎng)絡(luò)請求回調(diào)成功了才能確認(rèn)為 任務(wù)執(zhí)行完成.所有以上代碼需要修改.
隊列組修改完善版.
NSLog(@"開始了");
dispatch_group_t fGroup = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_enter(fGroup);
dispatch_group_async(fGroup, queue, ^{
// 發(fā)起網(wǎng)絡(luò)請求
// 成功或者失敗都掉用這個方法.
dispatch_group_leave(fGroup);
});
dispatch_group_enter(fGroup);
dispatch_group_async(fGroup, queue, ^{
// 發(fā)起網(wǎng)絡(luò)請求
// 成功或者失敗都掉用這個方法.
dispatch_group_leave(fGroup);
});
dispatch_group_notify(fGroup, queue, ^{
// 所有的任務(wù)都執(zhí)行完成后的回調(diào).
NSLog(@"都執(zhí)行完啦");
});
NSLog(@"結(jié)束了");
注: dispatch_group_enter與dispatch_group_leave是成對出現(xiàn)的, 只要所有的enter 都調(diào)用了 leave, 才會調(diào)用notify