GCD-兩個網(wǎng)絡請求同步問題

在網(wǎng)絡請求的時候有時有這種需求

兩個接口請求數(shù)據(jù)辽幌,然后我們才能做最后的數(shù)據(jù)處理。但是因為網(wǎng)絡請求是移步的 现横。我們并不知道什么時候兩個請求完成 漓拾。

通常面對這樣的需求會自然的想到 多線程 啊 阁最。表現(xiàn)真正的技術的時刻來啦,可以使用 group 隊列啊 骇两。等隊列中的請求任務都完成 速种,在通知主線程處理匯總數(shù)據(jù)嘛 。

今天我也是這么寫的低千,但是發(fā)現(xiàn)主線程并沒有等到隊列中的分線程網(wǎng)絡請求bock回調(diào)就返回了 配阵。我給block回調(diào)之前打印,確實是隊列中的任務都打印之后示血,才返回的主線程 棋傍。那么問題在哪里 ?


網(wǎng)絡請求然后處理響應數(shù)據(jù)是個耗時的操作难审,也是我們開發(fā)中常見的一種情形瘫拣,在網(wǎng)絡請求以及處理響應數(shù)據(jù)操作完畢之后我們在執(zhí)行別的操作這樣的過程也是我們開發(fā)中常見的情形。我們可以知道剔宪,

網(wǎng)絡請求的任務是提交給子線程異步處理了拂铡,網(wǎng)絡請求這樣的任務也就快速執(zhí)行完畢了,但是網(wǎng)絡請求是一個任務葱绒,處理收到的網(wǎng)絡響應又是一個任務感帅,注意不要把這兩個過程混為一談

而收到網(wǎng)絡響應以及處理返回響應的數(shù)據(jù)并不是在子線程中執(zhí)行的地淀,我們通過在回調(diào)響應處理的block中打印當前線程失球,會發(fā)現(xiàn)回調(diào)響應處理的block是在主線程中被執(zhí)行的。

如果很熟悉block回調(diào)這種通信機制的話帮毁,就不難理解实苞,這個回調(diào)響應的block真正被調(diào)用執(zhí)行的地方應該是AFN框架的底層代碼,而這部分代碼顯然是在主線程中執(zhí)行的烈疚。

這時候黔牵,如果我們需要確定這個主線程中收到網(wǎng)絡響應的數(shù)據(jù)被處理操作結束之后,才最后執(zhí)行我們需要最后的操作爷肝。換句話說猾浦,自線程就要等待,收到一個信號灯抛,才通知主線程金赦,自己真正的完成任務了 。

這個信號就是GCD的信號量 dispatch_semaphore_t

- (void)getNetworkingData{
     NSString *appIdKey = @"8781e4ef1c73ff20a180d3d7a42a8c04";
     NSString* urlString_1 = @"http://api.openweathermap.org/data/2.5/weather";
     NSString* urlString_2 = @"http://api.openweathermap.org/data/2.5/forecast/daily";
     NSDictionary* dictionary =@{@"lat":@"40.04991291",
                                 @"lon":@"116.25626162",
                                 @"APPID" : appIdKey};
     // 創(chuàng)建組
     dispatch_group_t group = dispatch_group_create();
     // 將第一個網(wǎng)絡請求任務添加到組中
     dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         // 創(chuàng)建信號量
         dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
         // 開始網(wǎng)絡請求任務
         AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
         [manager GET:urlString_1
           parameters:dictionary
             progress:nil
              success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                  NSLog(@"成功請求數(shù)據(jù)1:%@",[responseObject class]);
                  // 如果請求成功对嚼,發(fā)送信號量
                  dispatch_semaphore_signal(semaphore);
              } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                  NSLog(@"失敗請求數(shù)據(jù)");
                  // 如果請求失敗夹抗,也發(fā)送信號量
                  dispatch_semaphore_signal(semaphore);
              }];
         // 在網(wǎng)絡請求任務成功之前,信號量等待中
         dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
     });
     // 將第二個網(wǎng)絡請求任務添加到組中
     dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         // 創(chuàng)建信號量
         dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
         // 開始網(wǎng)絡請求任務
         AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
         [manager GET:urlString_2
           parameters:dictionary
             progress:nil
              success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                  NSLog(@"成功請求數(shù)據(jù)2:%@",[responseObject class]);
                  // 如果請求成功纵竖,發(fā)送信號量
                  dispatch_semaphore_signal(semaphore);
              } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                  NSLog(@"失敗請求數(shù)據(jù)");
                  // 如果請求失敗漠烧,也發(fā)送信號量
                  dispatch_semaphore_signal(semaphore);
              }];
         // 在網(wǎng)絡請求任務成功之前杏愤,信號量等待中
         dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
     });
     dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         NSLog(@"完成了網(wǎng)絡請求,不管網(wǎng)絡請求失敗了還是成功了沽甥。");
     });
 }

這樣做的具體步驟是這樣的 声邦。在自線程隊列中 。設置的信號等待 摆舟,一直到block回調(diào)完成(主線程中)亥曹,發(fā)送信號 。子線程收到信號恨诱,然后才會通知dispatch_group_notify 子線程的請求數(shù)據(jù)真正返回了媳瞪。

在使用的時候一定要想清楚哪個需要等待,哪個線程來發(fā)送照宝。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛇受,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厕鹃,更是在濱河造成了極大的恐慌兢仰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剂碴,死亡現(xiàn)場離奇詭異把将,居然都是意外死亡,警方通過查閱死者的電腦和手機忆矛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門察蹲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人催训,你說我怎么就攤上這事洽议。” “怎么了漫拭?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵亚兄,是天一觀的道長。 經(jīng)常有香客問我采驻,道長审胚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任挑宠,我火速辦了婚禮,結果婚禮上颓影,老公的妹妹穿的比我還像新娘各淀。我一直安慰自己,他們只是感情好诡挂,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布碎浇。 她就那樣靜靜地躺著临谱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奴璃。 梳的紋絲不亂的頭發(fā)上悉默,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音苟穆,去河邊找鬼抄课。 笑死,一個胖子當著我的面吹牛雳旅,可吹牛的內(nèi)容都是我干的跟磨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼攒盈,長吁一口氣:“原來是場噩夢啊……” “哼抵拘!你這毒婦竟也來了?” 一聲冷哼從身側響起型豁,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤僵蛛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迎变,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體充尉,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年氏豌,在試婚紗的時候發(fā)現(xiàn)自己被綠了喉酌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡泵喘,死狀恐怖泪电,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纪铺,我是刑警寧澤相速,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站鲜锚,受9級特大地震影響突诬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芜繁,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一旺隙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骏令,春花似錦蔬捷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铡俐。三九已至,卻和暖如春妥粟,著一層夾襖步出監(jiān)牢的瞬間审丘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工勾给, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滩报,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓锦秒,卻偏偏與公主長得像露泊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旅择,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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

  • 從哪說起呢惭笑? 單純講多線程編程真的不知道從哪下嘴。生真。 不如我直接引用一個最簡單的問題沉噩,以這個作為切入點好了 在ma...
    Mr_Baymax閱讀 2,757評論 1 17
  • AFHTTPRequestOperationManager 網(wǎng)絡傳輸協(xié)議UDP、TCP柱蟀、Http川蒙、Socket、X...
    Carden閱讀 4,337評論 0 12
  • iOS網(wǎng)絡架構討論梳理整理中长已。畜眨。。 其實如果沒有APIManager這一層是沒法使用delegate的术瓮,畢竟多個單...
    yhtang閱讀 5,188評論 1 23
  • 需求及問題 兩個接口請求數(shù)據(jù)康聂,然后我們才能做最后的數(shù)據(jù)處理。但是因為網(wǎng)絡請求是異步的 胞四,因此我們并不知道什么時候兩...
    _烈日閱讀 2,417評論 0 2
  • 新忠是我在路東開門市時的房東恬汁,是很有爭議的人物。 九零年左右吧辜伟,他開始在街邊擺攤賣農(nóng)藥氓侧,因為當時經(jīng)濟條件都很差,每...
    東流水sh閱讀 567評論 2 5