需求:
同時(shí)存在A,B,C,D四個(gè)網(wǎng)絡(luò)請(qǐng)求,要求同時(shí)發(fā)起四個(gè)網(wǎng)絡(luò)請(qǐng)求,當(dāng)四個(gè)網(wǎng)絡(luò)請(qǐng)求都返回?cái)?shù)據(jù)以后再處理事件E。
解決方法:
/創(chuàng)建信號(hào)量/
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
/創(chuàng)建全局并行/
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
NSLog(@"處理事件A");
for (int i = 0; i<10000; i++) {
NSLog(@"打印i %d",i);
}
dispatch_semaphore_signal(semaphore);
});
dispatch_group_async(group, queue, ^{
NSLog(@"處理事件B");
for (int i = 0; i<10000; i++) {
NSLog(@"打印j %d",i);
}
dispatch_semaphore_signal(semaphore);
});
dispatch_group_async(group, queue, ^{
NSLog(@"處理事件C");
for (int i = 0; i<10000; i++) {
NSLog(@"打印k %d",i);
}
dispatch_semaphore_signal(semaphore);
});
dispatch_group_async(group, queue, ^{
NSLog(@"處理事件D");
for (int i = 0; i<10000; i++) {
NSLog(@"打印l %d",i);
}
dispatch_semaphore_signal(semaphore);
});
dispatch_group_notify(group, queue, ^{
/四個(gè)請(qǐng)求對(duì)應(yīng)四次信號(hào)等待/
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"處理事件E");
});
分析:
首先創(chuàng)建并行隊(duì)列,創(chuàng)建隊(duì)列組,將隊(duì)列和需要處理的網(wǎng)絡(luò)請(qǐng)求分別添加到組中,當(dāng)組中所有隊(duì)列處理完事件后調(diào)用dispatch_group_notify,我們需要在里邊處理事件E。由于隊(duì)列在處理網(wǎng)絡(luò)請(qǐng)求時(shí)將”發(fā)送完一個(gè)請(qǐng)求”作為事件完成的標(biāo)記(此時(shí)還未獲得網(wǎng)絡(luò)請(qǐng)求返回?cái)?shù)據(jù)),所以在這里需要用信號(hào)量進(jìn)行控制,在執(zhí)行dispatch_group_notify前發(fā)起信號(hào)等待(4次信號(hào)等待,分別對(duì)應(yīng)每個(gè)隊(duì)列的信號(hào)通知),在每個(gè)隊(duì)列獲取到網(wǎng)絡(luò)請(qǐng)求返回?cái)?shù)據(jù)時(shí)發(fā)出信號(hào)通知。這樣就能完成需求中的要求。
如果需求中改為:同時(shí)存在A,B,C,D四個(gè)任務(wù),要求ABCD依次進(jìn)行處理,當(dāng)上一個(gè)完成時(shí)再進(jìn)行下一個(gè)任務(wù),當(dāng)四個(gè)任務(wù)都完成時(shí)再處理事件E。這時(shí)只需要將隊(duì)列改為串行隊(duì)列即可(不在需要信號(hào)量控制)。