? ? ? 我們?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中包含異步操作,我們可以使用第二種方式。