GCD常用的几个方法

2017-10-30  本文已影响0人  古月纳兰

当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(@"任务均完成,刷新界面");
    });
上一篇 下一篇

猜你喜欢

热点阅读