Индикатор активности не анимируется при создании группы отправки в iOS

Я хочу отображать индикатор активности при выполнении некоторых сетевых вызовов в блоке 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;
}

Что я делаю не так? Спасибо!

EDIT: мне нужен метод ожидания завершения блока, чтобы вернуть результат, который я получаю


person AppsDev    schedule 03.07.2013    source источник
comment
Вы блокируете основной поток вызовом dispatch_group_wait. Это очень плохо. Не делайте то, что вы делаете в основном потоке.   -  person rmaddy    schedule 03.07.2013
comment
Почему вы используете для этого диспетчерскую группу?   -  person rmaddy    schedule 03.07.2013
comment
@rmaddy Извините, моя ошибка, этот код находится в методе, который должен возвращать значение после завершения асинхронной задачи. я отредактировал свой вопрос   -  person AppsDev    schedule 04.07.2013


Ответы (2)


Вы должны использовать индикатор активности следующим образом:

[activityIndicator startAnimating];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    // Do something...
    dispatch_async(dispatch_get_main_queue(), ^{
        [activityIndicator stopAnimating];
    });
});

Если вы используете group, просто немного перепишите свой код.

person Renderhp    schedule 03.07.2013

Кажется, нет никакой необходимости в диспетчерской группе с тем, что вы делаете. Попробуй это:

- (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) своей собственной очередью.

person rmaddy    schedule 03.07.2013