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

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

作者: 金丝楠 | 来源:发表于2017-11-03 09:24 被阅读0次

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

// 创建信号量
    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);
    }];
}

相关文章

网友评论

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

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