iOS多个网络请求后再执行操作

一个页面需要同时发送网络请求A和B 然后需要在AB都返回结果之后在进行操作 写了个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(@"网络请求1和网络请求2同时发送!");
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"网络请求1完成");
        dispatch_group_leave(group);
    });
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:2];
        NSLog(@"网络请求2完成");
        dispatch_group_leave(group);
    });
    dispatch_group_notify(group, queue, ^{
        NSLog(@"网络请求1和网络请求2都完成!");
    });

这里dispatch_group_enterdispatch_group_leave一定要成对出现 然后用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(@"都完成了");

信号量没什么好说的 参考文章https://www.jianshu.com/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");
    });

这里需要注意 要想执行完前面所有的任务再执行barrier必须满足两个条件
1、所有任务都是在同一个队列中
2、队列不能是全局并行队列, 必须是自己创建的队列

栅栏.png

这只是用GCD的三种简单实现 当然还有其他很多方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容