最近项目需求,一个界面有多个请求,希望请求完才做操作,这时候我很快会想到用请求队列。
1.创建线程组
dispatch_group_t group = dispatch_group_create();
2.然后一下子请求了五个请求,如下:
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//请求1
[self Request1];
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self Request2];
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self Request3];
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self Request4];
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self Request5];
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//界面刷新
[_orderDetailTableView reloadData];
});
自信满满的以为完事了,结果运行一看发现界面上的数据没有刷新出来
上下滑动多次数据才出来,这时候我在想哪里出问题,原来造成的问题为多个请求均加载完成,但界面已在未得到数据前提前刷新导致界面空白。
这时候我想起了用GCD中信号量dispatch_semaphore进行实现
dispatch_semaphore信号量为基于计数器的一种多线程同步机制。用于解决在多个线程访问共有资源时候,会因为多线程的特性而引发数据出错的问题。
如果semaphore计数大于等于1,计数-1,返回,程序继续运行。如果计数为0,则等待。
dispatch_semaphore_signal(semaphore)为计数+1操作。dispatch_semaphore_wait(sema,DISPATCH_TIME_FOREVER)为设置等待时间
//获取箱子详情
- (void)Request1
{
//创建信号量并设置计数默认为0
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
[[NetTool sharedNetTool]GetShipmentDetailWithBindMark:self.blinder ExpressCode:self.experid Success:^(id obj) {
[[TipViewTool sharedTipViewTool]stopanimal:self];
if (reqSuccess)
{
//计数+1操作
dispatch_semaphore_signal(sema);
for(NSDictionary * dic in obj[@"Data"])
{
ShopingDetailMod * mod = [ShopingDetailMod new];
[mod setValuesForKeysWithDictionary:dic];
[self.boxDetailArr addObject:mod];
}
if(self.boxDetailArr.count>0)
{
ShopingDetailMod * mod =self.boxDetailArr[0];
if (mod.NotMergeChargeDetails.count==0)
{
self.ExpressBoxState = @"2";
}
}
}
} Failure:^(NSError *error) {
}];
//若计数为0则一直等待
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
ok.,完美解决问题,数据出来了