iOS处理高并发量的HTTP请求和数据集合的对应关系

一、处理高并发请求的核心代码如下:

// 创建信号量
    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 httpRequest];
        dispatch_semaphore_signal(semaphore);
    });
    
    dispatch_group_notify(group, queue, ^{
        // 请求对应信号等待
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    });

分析:

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

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

二、处理高并发请求完成后数据集合的一一对应关系

假如for遍历发送HTTP并发请求时,由于服务端响应数据的时间不同,会造成请求到的数据集合与发请求的顺序非一一对应,思路如下,创建可变字典NSMutableDictionary建立起请求与数据集合的对应关系。然后遍历字典,按key的顺序重新整理数据集合

        NSMutableDictionary *twoCategoryData = [NSMutableDictionary dictionary];
        [_bigDict setObject:twoSmallDataArr forKey:[NSString stringWithFormat:@"%ld",index]];

        if (_bigDict.count == _oneCategoryData.count) {
            for (int i=0; i<_oneCategoryData.count; i++) {
                NSArray *arr = [_bigDict objectForKey:[NSString stringWithFormat:@"%d",i]];
                [_twoCategoryData addObject:arr];
            }

项目中源码参考

// 获取一级分类data
- (void)getCategory {
    [HTTPMANGER getFirstLevelCategoryListSuccessedBlock:^(NSDictionary *resultDict) {
        NSLog(@"resultDict:%@",resultDict);
        if (DATAINFO_SUCCESS) {
            // 一级分类数组
            _oneCategoryData = [NSMutableArray array];
            _twoCategoryData = [NSMutableArray array];
            _bigDict = [NSMutableDictionary dictionary];
            for (NSDictionary *dic in DATA) {
                CategoryModel *categoryModel = [CategoryModel initJson:dic];
                [_oneCategoryData addObject:categoryModel];
                
                // 创建信号量
                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, ^{
                    
                    NSUInteger index = [DATA indexOfObject:dic];
                    [self getTwoClassData:dic index:index];

                    dispatch_semaphore_signal(semaphore);
                });
                dispatch_group_notify(group, queue, ^{
                    // 请求对应信号等待
                    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
                });
            }
        }
    } failedBolck:^(NSError *error) {
        NSLog(@"error:%@",error);
    }];
}
// 获取二级分类data
- (void)getTwoClassData:(NSDictionary *)dic index:(NSUInteger)index {
 
    [HTTPMANGER getSecondLevelCategoryListWithCategoryId:dic[@"CATEGORY_ID"] successedBlock:^(NSDictionary *resultDict) {
        NSLog(@"resultDict:%@",resultDict);
        
        NSMutableArray *twoSmallDataArr = [NSMutableArray array];
        NSMutableDictionary *twoCategoryData = [NSMutableDictionary dictionary];
        for (NSDictionary *smalldic in DATA) {
            CategoryModel *smallModel = [CategoryModel initJson:smalldic];
            [twoCategoryData setObject:smallModel.CATEGORY_NAME forKey:@"name"];
            [twoCategoryData setObject:smallModel.CATEGORY_ID forKey:@"type"];
            [twoCategoryData setObject:smallModel.SUPER_CATEGORY_ID forKey:@"super"];
            [twoSmallDataArr addObject:twoCategoryData];
        }
        //[_twoCategoryData addObject:twoSmallDataArr];
        [_bigDict setObject:twoSmallDataArr forKey:[NSString stringWithFormat:@"%ld",index]];
        
        if (_bigDict.count == _oneCategoryData.count) {
            for (int i=0; i<_oneCategoryData.count; i++) {
                NSArray *arr = [_bigDict objectForKey:[NSString stringWithFormat:@"%d",i]];
                [_twoCategoryData addObject:arr];
            }
            [self initSearchBar];
        }
    } failedBolck:^(NSError *error) {
        NSLog(@"error:%@",error);
    }];
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • GCD简介 GCD 是 libdispatch 的市场名称,而 libdispatch 作为 Apple 的一个库...
    独木舟的木阅读 5,102评论 0 5
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,445评论 11 349
  • 菩提善左 ,如来善右,如是中空 不见来人 ,不察其后,冷冷无声 且观且感 ,且听且闻,念念生相 晚风微寒 ,静水微...
    产品慕容阅读 2,929评论 0 0
  • 最近微微热播,被塞得狗粮满满。 虽然剧情傻白甜,但美好总是令人向往啊。借着“感觉世界美妙”的余温,禁不住翻找何以重...
    十里城阅读 2,435评论 0 0
  • 1.服务意识是指清楚明白地给用户美好体验。 2.这包含两个要求。第一,必须给用户美好体验。用户使用你产品的每一分每...
    琢磨概念者阅读 3,682评论 0 0