iOS 處理網(wǎng)絡(luò)請(qǐng)求時(shí)監(jiān)測(cè)異步請(qǐng)求全部完成刷新回調(diào) 和 異步請(qǐng)求依次進(jìn)行

? ? ? ? 在開發(fā)中我們常常會(huì)遇到在一個(gè)界面中需要異步請(qǐng)求多個(gè)接口捐祠,通過不同接口的返回?cái)?shù)據(jù)刷新界面不同控件的需求桑李。這種情況下有兩種選擇贵白,一種是 依次請(qǐng)求多個(gè)接口,分別拿到數(shù)據(jù) 這種方式有兩種方法實(shí)現(xiàn):1: 接口回調(diào)嵌套(容易造成代碼金字塔猬膨,寫法low)2:管理多線程 使異步的請(qǐng)求操作變成依次執(zhí)行呛伴。 依次請(qǐng)求接口的方式很容易造成用戶在當(dāng)前界面請(qǐng)求時(shí)間過長而影響體驗(yàn),這就需要我們 并發(fā)的發(fā)起多個(gè)異步請(qǐng)求了沛申,但有時(shí)候我們界面刷新時(shí) 不同界面間的數(shù)據(jù)存在 關(guān)聯(lián)褐隆,我們得在所有請(qǐng)求完成后才能 統(tǒng)一 對(duì)界面刷新或者其它操作庶弃, 下面我簡(jiǎn)單介紹使用GCD 使 監(jiān)聽異步請(qǐng)求全部完成 和 異步請(qǐng)求依次進(jìn)行 的方式。

1: 監(jiān)聽異步請(qǐng)求全部完成 再完成刷新界面等操作

先上代碼:


 dispatch_group_t group = dispatch_group_create();//創(chuàng)建隊(duì)列組

 dispatch_group_enter(group); //隊(duì)列組中加入一個(gè)異步操作
  //網(wǎng)絡(luò)請(qǐng)求
 [[HttpTool sharedJsonClient]   requestJsonDataWithPath:newUrlString andBlock:^(id  _Nonnull data, NSError * _Nonnull error) {
        NSLog(@"請(qǐng)求第一個(gè)完成");

        //隊(duì)列組中移除一個(gè)異步操作
        dispatch_group_leave(group);
    }];

    dispatch_group_enter(group);
    [[HttpTool sharedJsonClient] requestJsonDataWithPath:newUrlString andBlock:^(id  _Nonnull data, NSError * _Nonnull error) {
        NSLog(@"請(qǐng)求第二個(gè)完成");
        dispatch_group_leave(group);
    }];
    
    dispatch_group_enter(group);
    [[HttpTool sharedJsonClient] requestJsonDataWithPath:newUrlString andBlock:^(id  _Nonnull data, NSError * _Nonnull error) {
        NSLog(@"請(qǐng)求第三個(gè)完成");
        dispatch_group_leave(group);
    }];
    
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"請(qǐng)求全部完成 w回到主線程了");
    });

使用了CGD 中隊(duì)列組方式,通過發(fā)起請(qǐng)求時(shí) 加入一個(gè)異步事件到隊(duì)列組葬毫,請(qǐng)求完成后 將其移除, 最終監(jiān)聽隊(duì)列組中無操作時(shí) 即為所有請(qǐng)求事件已完成忽肛。 要注意的一點(diǎn)是 網(wǎng)絡(luò)請(qǐng)求本身就是異步的操作烂斋, 所以不能寫成:

    dispatch_async(queue, ^{
        [[HttpTool sharedJsonClient] requestJsonDataWithPath:newUrlString andBlock:^(id  _Nonnull data, NSError * _Nonnull error) {
            NSLog(@"請(qǐng)求第一個(gè)完成");
            dispatch_semaphore_signal(semaphore); //信號(hào)量 +1
        }];
    }

使異步的網(wǎng)絡(luò)請(qǐng)求依次進(jìn)行

上代碼:

    //新建一個(gè)串行(并行 都可以)隊(duì)列汛骂, 在該 隊(duì)列中對(duì) 所有 的網(wǎng)絡(luò)請(qǐng)求做操作
    dispatch_queue_t queue = dispatch_queue_create("sdsdsdsd", DISPATCH_QUEUE_SERIAL);
    //創(chuàng)建信號(hào)量
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); //初始為 0
    NSLog(@"開始執(zhí)行3");
    dispatch_async(queue, ^{

        NSLog(@"開始執(zhí)行1");
        [[HttpTool sharedJsonClient] requestJsonDataWithPath:newUrlString andBlock:^(id  _Nonnull data, NSError * _Nonnull error) {
            NSLog(@"請(qǐng)求第一個(gè)完成");
            dispatch_semaphore_signal(semaphore); //信號(hào)量 +1
        }];
        //信號(hào)量為0 時(shí)不 執(zhí)行  (如果信號(hào)量 不為 0 時(shí)才往下執(zhí)行并且 信號(hào)量 -1)
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

        NSLog(@"開始執(zhí)行2");
        [[HttpTool sharedJsonClient] requestJsonDataWithPath:newUrlString andBlock:^(id  _Nonnull data, NSError * _Nonnull error) {
            NSLog(@"請(qǐng)求第二個(gè)完成");
            dispatch_semaphore_signal(semaphore); //信號(hào)量 +1
        }];
        //信號(hào)量為0 時(shí)不 執(zhí)行  (如果信號(hào)量 不為 0 時(shí)才往下執(zhí)行并且 信號(hào)量 -1)
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);


        NSLog(@"開始執(zhí)行3");
        [[HttpTool sharedJsonClient] requestJsonDataWithPath:newUrlString andBlock:^(id  _Nonnull data, NSError * _Nonnull error) {
            NSLog(@"請(qǐng)求第三個(gè)完成");
            dispatch_async(queue, ^{
                 dispatch_semaphore_signal(semaphore); //信號(hào)量 +1
            });

        }];

        //信號(hào)量為0 時(shí)不 執(zhí)行  (如果信號(hào)量 不為 0 時(shí)才往下執(zhí)行并且 信號(hào)量 -1)
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"在當(dāng)前線程中繼續(xù)執(zhí)行");
    });

需要注意的事項(xiàng)是: 如果在 主隊(duì)列中 做 信號(hào)量的加減和wait等操作 淑掌,dispatch_semaphore_wait 方式會(huì)阻塞當(dāng)前線程(主線程)蝶念,而網(wǎng)絡(luò)請(qǐng)求的回調(diào)默認(rèn)是回到主線程中 處理事件的祸轮, 由此會(huì)導(dǎo)致 主線程中 dispatch_semaphore_signal(semaphore); 方法不會(huì)執(zhí)行,造成主線程死鎖。 所以苦酱,只能新建一個(gè) 串行或者 并行 隊(duì)列(新建隊(duì)列的時(shí)候會(huì)開一條線程管理事件) 對(duì) 網(wǎng)絡(luò)請(qǐng)求操作 做管理 (不能在主隊(duì)列)

實(shí)現(xiàn)這兩個(gè)需求應(yīng)時(shí)刻牢記一點(diǎn):使用AFN網(wǎng)絡(luò)請(qǐng)求操作會(huì)自動(dòng)開啟子線程執(zhí)行给猾,而請(qǐng)求完成后的操作會(huì)自動(dòng)回到主線程敢伸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末池颈,一起剝皮案震驚了整個(gè)濱河市躯砰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兰怠,老刑警劉巖揭保,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件快骗,死亡現(xiàn)場(chǎng)離奇詭異塔次,居然都是意外死亡励负,警方通過查閱死者的電腦和手機(jī)继榆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門略吨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翠忠,“玉大人,你說我怎么就攤上這事当娱】缦福” “怎么了河质?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵散休,是天一觀的道長淫半。 經(jīng)常有香客問我科吭,道長猴鲫,這世上最難降的妖魔是什么拂共? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮抚恒,結(jié)果婚禮上络拌,老公的妹妹穿的比我還像新娘春贸。我一直安慰自己萍恕,他們只是感情好允粤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布绳姨。 她就那樣靜靜地躺著,像睡著了一般脑蠕。 火紅的嫁衣襯著肌膚如雪谴仙。 梳的紋絲不亂的頭發(fā)上晃跺,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天掀虎,我揣著相機(jī)與錄音,去河邊找鬼阐滩。 笑死掂榔,一個(gè)胖子當(dāng)著我的面吹牛症杏,可吹牛的內(nèi)容都是我干的厉颤。 我是一名探鬼主播走芋,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼肋杖,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼状植!你這毒婦竟也來了怨喘?” 一聲冷哼從身側(cè)響起必怜,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤暖途,失蹤者是張志新(化名)和其女友劉穎驻售,沒想到半個(gè)月后欺栗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迟几,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梯啤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了察滑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贺辰。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吃靠,靈堂內(nèi)的尸體忽然破棺而出巢块,到底是詐尸還是另有隱情族奢,我是刑警寧澤越走,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布掺涛,位于F島的核電站疼进,受9級(jí)特大地震影響拣帽,放射性物質(zhì)發(fā)生泄漏减拭。R本人自食惡果不足惜修陡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绢记,春花似錦蠢熄、人聲如沸护赊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽判耕。三九已至壁熄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昌执,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留懂拾,地道東北人煤禽。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像岖赋,于是被迫代替她去往敵國和親檬果。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

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