美文网首页
// 同时存在A,B,C三个网络请求,要求同时发起三个网络请求,

// 同时存在A,B,C三个网络请求,要求同时发起三个网络请求,

作者: seventhboy | 来源:发表于2016-11-30 17:20 被阅读283次

    // 同时存在A,B,C三个网络请求,要求同时发起三个网络请求,当三个网络请求都返回数据以后再处理事件。

    // 数据请求

    -(void)initData

    {

    [[LoadingClass shared] showLoading:@"正在加载..."];
    
    // 创建信号量
    
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    
    // 创建全局并行
    
    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, ^{
    
        // 请求一
    
        [self tenderBaseRequest];
    
        
    
        dispatch_semaphore_signal(semaphore);
    
    });
    
    dispatch_group_async(group, queue, ^{
    
    
    
        // 请求二
    
        [self tenderBidRequest];
    
        dispatch_semaphore_signal(semaphore);
    
    });
    
    dispatch_group_async(group, queue, ^{
    
        // 请求三
    
        [self tenderInvalidRequest];
    
        dispatch_semaphore_signal(semaphore);
    
    });
    
    
    
    dispatch_group_notify(group, queue, ^{
    
        // 三个请求对应三次信号等待
    
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    });
    

    }

    分析:

    首先创建并行队列,创建队列组,将队列和需要处理的网络请求分别添加到组中,当组中所有队列处理完事件后调用dispatch_group_notify,我们需要在里边处理事件。由于队列在处理网络请求时将”发送完一个请求”作为事件完成的标记(此时还未获得网络请求返回数据),所以在这里需要用信号量进行控制,在执行dispatch_group_notify前发起信号等待(三次信号等待,分别对应每个队列的信号通知),在每个队列获取到网络请求返回数据时发出信号通知。这样就能完成需求中的要求。

    如果需求中改为:同时存在A,B,C三个任务,要求ABC依次进行处理,当上一个完成时再进行下一个任务,当三个任务都完成时再处理事件。这时只需要将队列改为串行队列即可(不在需要信号量控制)。

    相关文章

      网友评论

          本文标题:// 同时存在A,B,C三个网络请求,要求同时发起三个网络请求,

          本文链接:https://www.haomeiwen.com/subject/maytmttx.html