Использование GCD для ожидания условия - PullRequest
1 голос
/ 24 февраля 2012

Я пытаюсь навязать определенный порядок для выполнения задач с помощью Grand Central Dispatch, но у меня возникли некоторые проблемы с пониманием правильного способа сделать это.Я попытался использовать группы следующим образом:

Инициализация:

startup = dispatch_group_create();

Задачи, которые нужно ждать:

//Don't want to wait on the main thread, so dispatch async to a concurrent queue
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0L),^{
        //Wait until we're finished starting up
        dispatch_group_wait(startup,DISPATCH_TIME_FOREVER);
        //Now we can do this stuff back on the main queue
        dispatch_async(dispatch_get_main_queue(),^{
            //Do work
        });
    });

Работа, которую мне нужно ждать:

dispatch_group_async(startup,dispatch_get_main_queue(),^{ // work });

Из-за характера моего приложения задачи, которые нужно ждать, могут выполняться ДО той работы, которую мне нужно ждать.Что я действительно хочу, так это возможность ждать условия таким образом, когда условие выполнено, оно выполнено, и все будущие потоки могут делать свое дело.У GCD есть это?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Я не уверен во всех деталях вашей реализации, поэтому простите, если я повторяю то, что вы уже знаете.

  1. Создайте группу рассылки
  2. Используйте dispatch_group_asyncв последовательную очередь.Используя последовательную очередь, вы уверены, что ваши задачи обрабатываются в нужном вам порядке.Используйте параллельную очередь, если порядок не имеет значения, но в вашем вопросе говорилось, что они должны быть выполнены в определенном порядке.
  3. После того, как вы закончили отправку всех своих задач, используйте dispatch_group_notify.Это выполнит блок в указанной вами очереди, как только все задачи, назначенные группе, завершат обработку.

    dispatch_group_notify(startup, dispatch_get_main_queue(), ^{
          // Don't forget to release the dispatch group!
          dispatch_release(startup)
         // perform work block;
    });
    

Для определенного анализа необходимо выполнить некоторую обработкуданные, которые можно сделать, пока выполняется остальная часть анализа.Я назначаю обработку группе в параллельной очереди.Затем, когда мой анализ завершен, я проверяю, завершена ли группа.Если это сделано, я убираю вещи.Если нет, используйте dispatch_group_notify () и выполните работу впоследствии.Что-то вроде этого:

double delayInSeconds = 2.0;
dispatch_time_t groupWaitTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
if (dispatch_group_wait(myDispatchGroup, groupWaitTime)==0){
    NSLog(@"dispatch group completed in time");
    dispatch_release(myDispatchGroup);
    [self parsingCompleteWithActivity:activity];
}else{
    NSLog(@"dispatch group did not complete in time");
    dispatch_group_notify(myDispatchGroup, dispatch_get_main_queue(), ^{
            dispatch_release(myDispatchGroup);
            [self parsingCompleteWithActivity:activity];
    });
}

Удачи!

0 голосов
/ 24 февраля 2012

Работает, если я использую семафор, а затем после каждого звонка подаю сигнал ожидания. Также работает, если я вызываю dispatch_group_enter и dispatch_group_leave.

...