我想在dispatch_group_asyc
块中执行某些网络呼叫时显示活动指示符。但活动指示器仅显示块完成的时间。我正在创建dispatch_group_t
,因为我需要在执行其他任务之前获取网络调用的结果。这是我的代码的简化版本:
- (BOOL)doNetCall
{
[activityIndicator startAnimating];
__block BOOL netResult = NO;
dispatch_queue_t queue = dispatch_queue_create(netQueue, NULL);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,queue,^{
netResult = [service queryService];
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_release(group);
dispatch_release(queue);
[activityIndicator stopAnimating];
if (netResult) {
// Perform some tasks
}
else {
[self showAlertView];
}
return netResult;
}
我做错了什么?谢谢!
编辑:我需要方法等到块完成才能返回我得到的结果
答案 0 :(得分:4)
您应该以这种方式使用活动指示器:
[activityIndicator startAnimating];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
// Do something...
dispatch_async(dispatch_get_main_queue(), ^{
[activityIndicator stopAnimating];
});
});
如果您正在使用group
,请稍微重写您的代码。
答案 1 :(得分:0)
似乎没有任何需要与您正在做的事情的派遣小组。试试这个:
- (void)buttonClicked {
[activityIndicator startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
BOOL netResult = [service queryService];
dispatch_async(dispatch_get_main_queue(), ^{
[activityIndicator stopAnimating];
if (netResult) {
// perform some tasks
} else {
// show alert
}
});
});
}
如果您有队列,请将dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
的呼叫替换为您自己的队列。