(一)、多個(gè)網(wǎng)絡(luò)請求的同步問題
解決1:通過添加標(biāo)識來判斷請求是否全部結(jié)束
用一個(gè)finishedCount變量記錄完成請求的個(gè)數(shù),然后在單個(gè)網(wǎng)絡(luò)請求結(jié)束回調(diào)的時(shí)候判斷當(dāng)前完成的網(wǎng)絡(luò)請求個(gè)數(shù)是否和總的網(wǎng)絡(luò)請求個(gè)數(shù)相等,如果相等則說明請求結(jié)束镀琉。對于批量網(wǎng)絡(luò)請求失敗的處理是诚啃,只要一個(gè)失敗就立即停止請求浆竭,調(diào)用失敗回調(diào):
解決2:dispatch_group + 信號量挪哄。處理異步任務(wù)的同步吧秕,當(dāng)異步任務(wù)開始前調(diào)用dispatch_group_enter異步任務(wù)結(jié)束后調(diào)用dispatch_group_leve;當(dāng)計(jì)數(shù)為0時(shí)會調(diào)用dispatch_group_notify迹炼。
- (void)groupSync
{
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(5);
NSLog(@"任務(wù)一完成");
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(8);
NSLog(@"任務(wù)二完成");
dispatch_group_leave(group);
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 回到主線程刷新UI
NSLog(@"任務(wù)完成");
});
}