當(dāng)app首頁(yè)有多個(gè)接口的時(shí)候,一個(gè)個(gè)的去寫(xiě)是不是有點(diǎn)太菜了蓖谢。這時(shí)我們就可以使用強(qiáng)大的GCD,用異步+并發(fā)譬涡,好處是如果多個(gè)任務(wù)闪幽,就會(huì)開(kāi)啟多個(gè)線程,并發(fā)處理昂儒。
/**返回并發(fā)隊(duì)列
@param "com.home" 隊(duì)列的名字 可以用bundle ID + 隊(duì)列名字
@param DISPATCH_QUEUE_CONCURRENT并發(fā)
DISPATCH_QUEUE_SERIAL 串行
@return 并發(fā)隊(duì)列
*/
dispatch_queue_t queue =dispatch_queue_create("com.home",DISPATCH_QUEUE_CONCURRENT);
// 異步執(zhí)行多個(gè)網(wǎng)絡(luò)請(qǐng)求
dispatch_async(queue, ^{//并行異步執(zhí)行
[self requestUserPersonalInformation];
[self requestBornerAndActivityDatas];
NSLog(@"任務(wù)一==%@",[NSThreadcurrentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任務(wù)二==%@",[NSThreadcurrentThread]);
});
當(dāng)app在多個(gè)請(qǐng)求結(jié)束后沟使,再去刷新界面。這時(shí)候就可以用dispatch_group實(shí)現(xiàn)分組并發(fā)網(wǎng)絡(luò)請(qǐng)求
在group中 enter和leave是一一對(duì)應(yīng)的
dispatch_group_enter(group);//通知group渊跋,下面的任務(wù)馬上要放到group中執(zhí)行了腊嗡。
dispatch_group_leave(group);//通知group,任務(wù)完成了拾酝,該任務(wù)要從group中移除了燕少。
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
/* //請(qǐng)求一
[網(wǎng)絡(luò)請(qǐng)求:{
NSLog(@"任務(wù)一完成");
成功 or 失敗:dispatch_group_leave(group);
}];
*/
[HJDHttpRequest netRequestPOSTWithRequestURL:@"app/login.do" WithParameter:requestUserDatas WithReturnValeuBlock:^(id responseObject, NSError *error) {
NSLog(@"任務(wù)一完成");
成功 or 失斴锒凇:dispatch_group_leave(group);
});
dispatch_group_enter;
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//請(qǐng)求二
[網(wǎng)絡(luò)請(qǐng)求:{
NSLog(@"任務(wù)二完成");
成功 or 失斂兔恰:dispatch_group_leave(group);
}];
});
//dispatch_group_wait wait函數(shù)一直阻塞 這個(gè)函數(shù)返回 0則會(huì)繼續(xù)執(zhí)行,否則一直等待 group 組內(nèi)的所有成員任務(wù)完畢(在任務(wù)開(kāi)始前 調(diào)用 enter,任務(wù)完成時(shí)調(diào)用leave底挫,完成就減1恒傻,直到0 為止)
// dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//界面刷新
NSLog(@"任務(wù)均完成,刷新界面");
});