iOS處理高并發(fā)量的HTTP請求和數(shù)據(jù)集合的對應關系

一讳苦、處理高并發(fā)請求的核心代碼如下:

// 創(chuàng)建信號量
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    // 創(chuàng)建全局并行
    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);
    });

分析:

首先創(chuàng)建并行隊列,創(chuàng)建隊列組,將隊列和需要處理的網(wǎng)絡請求分別添加到組中俯在,當組中所有隊列處理完事件后調(diào)用dispatch_group_notify搔确,我們需要在里邊處理事件彼棍。由于隊列在處理網(wǎng)絡請求時將”發(fā)送完一個請求”作為事件完成的標記(此時還未獲得網(wǎng)絡請求返回數(shù)據(jù)),所以在這里需要用信號量進行控制膳算,在執(zhí)行dispatch_group_notify前發(fā)起信號等待(三次信號等待座硕,分別對應每個隊列的信號通知),在每個隊列獲取到網(wǎng)絡請求返回數(shù)據(jù)時發(fā)出信號通知涕蜂。這樣就能完成需求中的要求华匾。

如果需求中改為:同時存在A,B,C三個任務,要求ABC依次進行處理机隙,當上一個完成時再進行下一個任務瘦真,當三個任務都完成時再處理事件。這時只需要將隊列改為串行隊列即可(不在需要信號量控制)黍瞧。

二诸尽、處理高并發(fā)請求完成后數(shù)據(jù)集合的一一對應關系

假如for遍歷發(fā)送HTTP并發(fā)請求時,由于服務端響應數(shù)據(jù)的時間不同印颤,會造成請求到的數(shù)據(jù)集合與發(fā)請求的順序非一一對應您机,思路如下,創(chuàng)建可變字典NSMutableDictionary建立起請求與數(shù)據(jù)集合的對應關系。然后遍歷字典际看,按key的順序重新整理數(shù)據(jù)集合

        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) {
            // 一級分類數(shù)組
            _oneCategoryData = [NSMutableArray array];
            _twoCategoryData = [NSMutableArray array];
            _bigDict = [NSMutableDictionary dictionary];
            for (NSDictionary *dic in DATA) {
                CategoryModel *categoryModel = [CategoryModel initJson:dic];
                [_oneCategoryData addObject:categoryModel];
                
                // 創(chuàng)建信號量
                dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
                // 創(chuàng)建全局并行
                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);
    }];
}

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咸产,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仲闽,更是在濱河造成了極大的恐慌脑溢,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赖欣,死亡現(xiàn)場離奇詭異屑彻,居然都是意外死亡,警方通過查閱死者的電腦和手機顶吮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門社牲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悴了,你說我怎么就攤上這事搏恤。” “怎么了湃交?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵熟空,是天一觀的道長。 經(jīng)常有香客問我搞莺,道長息罗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任腮敌,我火速辦了婚禮阱当,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糜工。我一直安慰自己弊添,他們只是感情好,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布捌木。 她就那樣靜靜地躺著油坝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刨裆。 梳的紋絲不亂的頭發(fā)上澈圈,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機與錄音帆啃,去河邊找鬼瞬女。 笑死,一個胖子當著我的面吹牛努潘,可吹牛的內(nèi)容都是我干的诽偷。 我是一名探鬼主播坤学,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼报慕!你這毒婦竟也來了深浮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤眠冈,失蹤者是張志新(化名)和其女友劉穎飞苇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜗顽,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡布卡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诫舅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羽利。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡宫患,死狀恐怖刊懈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娃闲,我是刑警寧澤虚汛,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站皇帮,受9級特大地震影響卷哩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜属拾,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一将谊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渐白,春花似錦尊浓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至襟诸,卻和暖如春瓦堵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歌亲。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工菇用, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陷揪。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓惋鸥,卻偏偏與公主長得像泉唁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子揩慕,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • GCD簡介 GCD 是 libdispatch 的市場名稱亭畜,而 libdispatch 作為 Apple 的一個庫...
    獨木舟的木閱讀 1,252評論 0 5
  • 從三月份找實習到現(xiàn)在,面了一些公司迎卤,掛了不少拴鸵,但最終還是拿到小米、百度蜗搔、阿里劲藐、京東、新浪樟凄、CVTE聘芜、樂視家的研發(fā)崗...
    時芥藍閱讀 42,255評論 11 349
  • 菩提善左 汰现,如來善右,如是中空 不見來人 叔壤,不察其后瞎饲,冷冷無聲 且觀且感 ,且聽且聞炼绘,念念生相 晚風微寒 嗅战,靜水微...
    產(chǎn)品慕容閱讀 376評論 0 0
  • 最近微微熱播,被塞得狗糧滿滿俺亮。 雖然劇情傻白甜驮捍,但美好總是令人向往啊。借著“感覺世界美妙”的余溫脚曾,禁不住翻找何以重...
    十里城閱讀 304評論 0 0
  • 1.服務意識是指清楚明白地給用戶美好體驗东且。 2.這包含兩個要求。第一斟珊,必須給用戶美好體驗苇倡。用戶使用你產(chǎn)品的每一分每...
    琢磨概念者閱讀 597評論 0 0