Гранд Централ Диспетчер.Как запустить одну асинхронную группу, подождать, затем запустить другую, снова подождать и закончить? - PullRequest
1 голос
/ 08 декабря 2011

Ниже приведен пример функции, в которой я пытаюсь запустить одну основную группу, подождать, затем запустить две другие фоновые задачи в отдельных потоках, подождать, а затем вернуть значение, измененное в общих блоках, показанных ниже.Ниже показано мое предположение о том, как это сделать.Это работает, если я запускаю эти блоки все в одном блоке.Это не удается, когда я разделяю блоки.У кого-нибудь есть пример того, как они выполняют нечто подобное?Заранее спасибо за помощь.

-(NSString *)sampleFunction:(NSString*)inputString
{
 __block NSString *returnString;

 dispatch_group_t mainGroup = dispatch_group_create();
 dispatch_group_t otherGroup = dispatch_group_create();

 void (^firstBlock)(void) = ^(void)
 {
  ...
 };

 void (^secondBlock)(void) = ^(void)
 {
  ...
 };


 void (^thirdBlock)(void) = ^(void)
 {
  ...
 };

 dispatch_group_async(oneGroup, dispatch_get_global_queue(0, 0), firstBlock);

 dispatch_group_wait(oneGroup, sizeof(int));

 dispatch_group_async(otherGroup, dispatch_get_global_queue(0, 0), secondBlock);
 dispatch_group_async(otherGroup, dispatch_get_global_queue(0, 0), thirdBlock);

 dispatch_group_wait(otherGroup, sizeof(int));

 dispatch_release(userGroup); 
 dispatch_release(otherGroup);

 return returnString;
}

Ответы [ 2 ]

7 голосов
/ 08 декабря 2011

dispatch_semaphore - ваш друг здесь.: -)

/* Create your semaphore with 0 */
dispatch_semaphore_t sema = dispatch_semaphore_create(0);

/* wait on the semaphore, causes your second & third queue to wait */
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);

/* At the end of your first queue finishing, signal the semaphore waiting in 
   the 2nd queue to take over */
dispatch_semaphore_signal(sema);

Если вы хотите еще более простое решение, просто используйте dispatch_apply (он работает для вас семафором) вместо этих групп, хотя и не совсем уверены, для чего вы используете свои группы.

4 голосов
/ 09 декабря 2011

Есть много разных способов сделать это, но наиболее концептуально простым (или, по крайней мере, очевидным) способом было бы создать группу для каждого этапа вашего «конвейера», а затем выполнить обратный вызов завершения для расписания группы А: работа в группе B, которая также имеет обратный вызов завершения, который планирует работу в группе C.

Ключ здесь не в том, чтобы «ждать» завершения группы - это не нужно. Группы могут иметь блоки завершения, которые будут запускаться автоматически по окончании последнего блока в этой группе (см. Dispatch_group_notify ()), и это хороший способ создания точек «вхождения», когда вы разветвляли кучу работы группа.

...