看到標(biāo)題也許會(huì)懵逼入愧,我也為了起這個(gè)標(biāo)題懵逼了半天。舉個(gè)例子深碱,現(xiàn)在要等到兩個(gè)網(wǎng)絡(luò)請(qǐng)求都結(jié)束之后才做接下來的操作腹鹉。有人會(huì)說這和標(biāo)題有毛線關(guān)系啊,那就往下看吧敷硅。解決這個(gè)問題的關(guān)鍵是知道兩個(gè)網(wǎng)絡(luò)請(qǐng)求什么時(shí)候結(jié)束就ok了功咒。
方法1:設(shè)兩個(gè)BOOL值在網(wǎng)絡(luò)請(qǐng)求結(jié)束的時(shí)候設(shè)為YES就ok了。
//設(shè)個(gè)線程模仿網(wǎng)絡(luò)請(qǐng)求
dispatch_async(dispatch_get_main_queue(), ^{
//休眠(模仿網(wǎng)絡(luò)請(qǐng)求所需要的時(shí)間)
sleep(2);
self.request1 = YES;
[self requestFinish];
});
dispatch_async(dispatch_get_main_queue(), ^{
//休眠(模仿網(wǎng)絡(luò)請(qǐng)求所需要的時(shí)間)
sleep(3);
self.request2 = YES;
[self requestFinish];
});
-(void)requestFinish
{
if (self.request1 && self.request2) {
//將request1和request2設(shè)為NO绞蹦,可能會(huì)遇到重復(fù)加載
self.request2 = NO;
self.request1 = NO;
NSLog(@"requestFinish");
}
}
方法2:這個(gè)方法就和標(biāo)題有關(guān)了力奋,先粘為進(jìn)
// 如果必須在并行隊(duì)列中異步執(zhí)行任務(wù),比如說獲取到兩個(gè)請(qǐng)求后的數(shù)據(jù)再進(jìn)行下一步的操作坦辟,這時(shí)可以用dispatch_group_enter和dispatch_group_leave刊侯,這兩個(gè)必須成對(duì)出現(xiàn),有一個(gè)enter就要有一個(gè)leave锉走,否則會(huì)造成死鎖,dispatch_group_notify不會(huì)被調(diào)用滨彻,還會(huì)崩潰的
// 全局并行隊(duì)列
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
// 創(chuàng)建一個(gè)group
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_group_async(group, globalQueue, ^{
// 網(wǎng)絡(luò)請(qǐng)求線程
dispatch_async(globalQueue, ^{
sleep(4);
NSLog(@"group-01 - %@", [NSThread currentThread]);
dispatch_group_leave(group);
});
});
dispatch_group_enter(group);
dispatch_group_async(group, globalQueue, ^{
// 網(wǎng)絡(luò)請(qǐng)求線程
dispatch_async(globalQueue, ^{
sleep(1);
NSLog(@"group-02 - %@", [NSThread currentThread]);
dispatch_group_leave(group);
});
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"完成 - %@", [NSThread currentThread]);
});
這個(gè)方法是通過并行隊(duì)列和group來實(shí)現(xiàn)的,dispatch_group_enter
和dispatch_group_leave
保證了網(wǎng)絡(luò)請(qǐng)求結(jié)束了才執(zhí)行dispatch_group_notify
挪蹭,現(xiàn)在想想方法2是不是和標(biāo)題有關(guān)系了亭饵,可能還不是很符合。就這樣了梁厉,謝謝大家辜羊。