使用Dispatch_Group管理相互依賴的操作

? ? ? 我們?cè)谡?qǐng)求網(wǎng)絡(luò)數(shù)據(jù)的時(shí)候,有時(shí)候多個(gè)接口之間存在依賴,如果嵌套著來編寫代碼就顯得代碼邏輯復(fù)雜,不方便閱讀和管理,經(jīng)過查找網(wǎng)上資料,本人總結(jié)了兩種方式方便于大家使用,也方便自己記憶查找。

第一種

#pragma mark 帶有異步請(qǐng)求的任務(wù)不適合用此方式

- (void)creatDispatchGroup{

//? ? 創(chuàng)建 group 和 queue

dispatch_group_t getDataGroup = dispatch_group_create();

dispatch_queue_t getDataQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//? ? 將任務(wù)添加到 group 和指定的 queue

dispatch_group_async(getDataGroup, getDataQueue, ^{

[self ML_DeviceData];

});

dispatch_group_async(getDataGroup, getDataQueue, ^{

[self DW_DeviceData];

});

//? ? 不阻塞當(dāng)前線程,馬上返回

dispatch_queue_t notifyQueue = dispatch_get_main_queue();

dispatch_group_notify(getDataGroup, notifyQueue, ^{

CLog(@"隊(duì)列執(zhí)行完畢---------");

});

//? ? 阻塞當(dāng)前線程,直到group中的任務(wù)全部完成才進(jìn)行返回

//? ? dispatch_group_wait(getDataGroup, DISPATCH_TIME_FOREVER);

}

? ? ? 上述代碼中的適合向group種添加同步執(zhí)行的代碼,但我們的網(wǎng)絡(luò)請(qǐng)求大多數(shù)都是異步請(qǐng)求的,所以對(duì)于進(jìn)行異步網(wǎng)絡(luò)請(qǐng)求的操作不適合使用這種隊(duì)列,因?yàn)楫?dāng)我們得到"隊(duì)列執(zhí)行完畢----"的輸出的時(shí)候,這時(shí)候數(shù)據(jù)可能還沒有返回,也就無法進(jìn)行下一步操作,使用的時(shí)候大家一定要注意。

第二種

#pragma mark? 適合線程組中帶有異步請(qǐng)求的調(diào)用 等待所有異步請(qǐng)求完全結(jié)束才調(diào)用回掉block

- (void)creatNewDispatchGroup{

//? ? 創(chuàng)建 group 和 queue

dispatch_group_t getDataGroup = dispatch_group_create();

//? ? dispatch_queue_t getDataQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//? ? 數(shù)據(jù)請(qǐng)求1

[POSTData ML_getDataWithURL:defaultMLurl andSentDic:@{@"cuId":userCUID} objectName:@"getAllPuList" andMethodName:@"getObject" success:^(id responseData) {

CLog(@"%@",responseData);

dispatch_group_leave(getDataGroup);

} fail:^(NSError *error) {

}];

//? ? 數(shù)據(jù)請(qǐng)求2

dispatch_group_enter(getDataGroup);

[POSTData getResponseDataWithURL:defaultWebServiceUrl andsentDataArr:sentArr andMethodName:@"QueryEquipment" andKey:defaultKey isPMKEY:YES success:^(id responseData) {

CLog(@"%@",responseData);

dispatch_group_leave(getDataGroup);

} fail:^(NSError *error) {

}];

dispatch_group_notify(getDataGroup, dispatch_get_main_queue(), ^{

CLog(@"完成所有請(qǐng)求");

});

}

? ? ? 這種方法可以滿足我們的需求,當(dāng)?shù)谝粋€(gè)異步請(qǐng)求完成結(jié)束后,才會(huì)接著緊著進(jìn)行第二個(gè)異步請(qǐng)求,當(dāng)所有請(qǐng)求完全結(jié)束后我們的dispatch_group_notify方法才會(huì)得到回調(diào)。

總結(jié)

? ? ? 所以進(jìn)行多個(gè)相互依賴的操作的時(shí)候,如果是同步進(jìn)行操作我們可以使用第一種方式,如果group中包含異步操作,我們可以使用第二種方式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • NSThread 第一種:通過NSThread的對(duì)象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 948評(píng)論 0 3
  • 談到iOS多線程,一般都會(huì)談到四種方式:pthread、NSThread、GCD和NSOperation。其中,蘋...
    攻城獅GG閱讀 360評(píng)論 0 3
  • GCD (Grand Central Dispatch) :iOS4 開始引入,使用更加方便,程序員只需要將任務(wù)添...
    池鵬程閱讀 1,437評(píng)論 0 2
  • 一陣輕描淡寫的風(fēng) 引起冬日的一場(chǎng)雪崩 用心守護(hù)的城堡轟然坍塌 偽裝的堅(jiān)強(qiáng)無處遁形 風(fēng)吹散枯萎的落葉 記憶便隨處飄零...
    A安之若素A閱讀 229評(píng)論 0 0
  • 今日和往常一樣在柜臺(tái)辦理業(yè)務(wù),突然來了一位中年大媽,個(gè)不高,略白凈,架著一副金絲邊眼鏡,口音不是特別清楚,見面例行...
    克里斯丁閱讀 271評(píng)論 0 1

友情鏈接更多精彩內(nèi)容