当app首页有多个接口的时候,一个个的去写是不是有点太菜了。这时我们就可以使用强大的GCD,用异步+并发,好处是如果多个任务,就会开启多个线程,并发处理。
/**返回并发队列
@param "com.home" 队列的名字 可以用bundle ID + 队列名字
@param DISPATCH_QUEUE_CONCURRENT并发
DISPATCH_QUEUE_SERIAL 串行
@return 并发队列
*/
dispatch_queue_t queue =dispatch_queue_create("com.home",DISPATCH_QUEUE_CONCURRENT);
// 异步执行多个网络请求
dispatch_async(queue, ^{//并行异步执行
[self requestUserPersonalInformation];
[self requestBornerAndActivityDatas];
NSLog(@"任务一==%@",[NSThreadcurrentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务二==%@",[NSThreadcurrentThread]);
});
当app在多个请求结束后,再去刷新界面。这时候就可以用dispatch_group实现分组并发网络请求
在group中 enter和leave是一一对应的
dispatch_group_enter(group);//通知group,下面的任务马上要放到group中执行了。
dispatch_group_leave(group);//通知group,任务完成了,该任务要从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), ^{
/* //请求一
[网络请求:{
NSLog(@"任务一完成");
成功 or 失败:dispatch_group_leave(group);
}];
*/
[HJDHttpRequest netRequestPOSTWithRequestURL:@"app/login.do" WithParameter:requestUserDatas WithReturnValeuBlock:^(id responseObject, NSError *error) {
NSLog(@"任务一完成");
成功 or 失败:dispatch_group_leave(group);
});
dispatch_group_enter;
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//请求二
[网络请求:{
NSLog(@"任务二完成");
成功 or 失败:dispatch_group_leave(group);
}];
});
//dispatch_group_wait wait函数一直阻塞 这个函数返回 0则会继续执行,否则一直等待 group 组内的所有成员任务完毕(在任务开始前 调用 enter,任务完成时调用leave,完成就减1,直到0 为止)
// dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//界面刷新
NSLog(@"任务均完成,刷新界面");
});
网友评论