在iOS中创建调度组时,活动指示器不动画

时间:2013-07-03 14:57:36

标签: ios asynchronous grand-central-dispatch uiactivityindicatorview

我想在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;
}

我做错了什么?谢谢!

编辑:我需要方法等到块完成才能返回我得到的结果

2 个答案:

答案 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)的呼叫替换为您自己的队列。