iOS多個網(wǎng)絡(luò)請求后再執(zhí)行操作

一個頁面需要同時發(fā)送網(wǎng)絡(luò)請求A和B 然后需要在AB都返回結(jié)果之后在進(jìn)行操作 寫了個demo模擬下這種情況

第一種方法dispatch_group_t控制

    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    NSLog(@"網(wǎng)絡(luò)請求1和網(wǎng)絡(luò)請求2同時發(fā)送!");
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"網(wǎng)絡(luò)請求1完成");
        dispatch_group_leave(group);
    });
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:2];
        NSLog(@"網(wǎng)絡(luò)請求2完成");
        dispatch_group_leave(group);
    });
    dispatch_group_notify(group, queue, ^{
        NSLog(@"網(wǎng)絡(luò)請求1和網(wǎng)絡(luò)請求2都完成!");
    });

這里dispatch_group_enterdispatch_group_leave一定要成對出現(xiàn) 然后用dispatch_group_notify等待完成

方法二 信號量dispatch_semaphore_t控制

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    NSLog(@"0");
    dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"1");
        dispatch_semaphore_signal(sem);
    });
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:2];
        NSLog(@"2");
        dispatch_semaphore_signal(sem);
    });
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    NSLog(@"都完成了");

信號量沒什么好說的 參考文章http://www.itdecent.cn/p/8fb33b89b5a7

第三種 柵欄塊dispatch_barrier_async控制

    dispatch_queue_t conQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(conQueue, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"111");
    });
    dispatch_async(conQueue, ^{
        [NSThread sleepForTimeInterval:2];
        NSLog(@"222");
    });
    dispatch_barrier_async(conQueue, ^{
        NSLog(@"333");
    });

這里需要注意 要想執(zhí)行完前面所有的任務(wù)再執(zhí)行barrier必須滿足兩個條件
1、所有任務(wù)都是在同一個隊列中
2、隊列不能是全局并行隊列, 必須是自己創(chuàng)建的隊列

柵欄.png

這只是用GCD的三種簡單實現(xiàn) 當(dāng)然還有其他很多方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容