0

Моя проблема проста. У меня три задачи, одна из которых вызвана NSNotification. Как дождаться завершения всей задачи перед продолжением.Отправка группы и NSNotification

До сих пор я пытался использовать группу отправки, но не могу найти способ добавить задачу, вызванную NSNotification. (Я пытался добавить команду отправки в рамках метода инициированной NSNotification, но если уведомление приходит после задачи 1 и 2, это слишком поздно, чтобы добавить в группу, как она уже завершена.)

_asyncDispatch = dispatch_group_create(); 


dispatch_group_async(_asyncDispatch,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
    [self doTask1]; 
}); 

dispatch_group_async(_asyncDispatch,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
    [self doTask2]; 
}); 

dispatch_group_notify(_asyncDispatch,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 

    // We're done! 
}); 

ответ

0

Спасибо @ Sega-Zero за руководство. Вот решение, которое я реализовал.

_operationQueue = [[NSOperationQueue alloc] init]; 
_semaphore = dispatch_semaphore_create(0); 

NSOperation *uploadOperation = [NSBlockOperation blockOperationWithBlock:^{ 
    [self doFirstTask]; 
}]; 

NSOperation *downloadOperation = [NSBlockOperation blockOperationWithBlock:^{ 
    dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER); 
}]; 
NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{ 
    [self doNextMethod]; 
}]; 

[completionOperation addDependency:uploadOperation]; 
[completionOperation addDependency:downloadOperation]; 

[_operationQueue addOperations:@[uploadOperation, downloadOperation, completionOperation] waitUntilFinished:NO]; 

И затем, в способе, инициированной NSNotification

-(void)methodTriggeredByNotif:(NSNotification *)notification { 

// doing some serious stuff here and when done 
dispatch_semaphore_signal(_semaphore);} 

Voila. Спасибо всем.

0

Я предлагаю вместо этого вы должны использовать NSOperation и NSOperationQueue. Вы можете связать все операции как dependency друг с другом и дождаться, пока все три будут выполнены. Затем в блоке завершения последней операции сделайте свой обработчик.

Если вы в этом смущены, вы все равно можете использовать диспетчерскую группу, но несколько иначе. Использовать dispatch_group_enter/dispatch_group_leave + dispatch_group_wait. Нечто подобное:

dispatch_group_t waitGroup = dispatch_group_create(); 
dispatch_group_enter(waitGroup); 
dispatch_async(otherQueue, ^{ 
    //long-running code 
    dispatch_group_leave(waitGroup); 
} 
dispatch_group_wait(waitGroup, DISPATCH_TIME_FOREVER); 

вызова dispatch_group_enter, когда одна из ваших задач начинает работать и dispatch_group_leave после задачи были завершены. Вызовите dispatch_group_wait в том месте, где вам нужно дождаться завершения всех заданий. Не ждите в главной теме! Для этого лучше создать отдельную очередь.

Но я призываю вас использовать NSOperations. Это намного более контролируемое и способное отменить.

+0

Пробовал это, но я все равно попал в один и тот же блокпост. Как добавить метод, который запускается NSNotification? – GrandSteph

+0

Я не совсем понимаю, в чем проблема? Вам нужны задачи 1 и 2, ожидающие запуска NSNotification? Или вы хотите дождаться 3 задач, один из них создается с помощью NSNotification в любой момент времени, а затем вызывает некоторый код? –

+0

второй вариант сэр! :) Я хочу ждать 3 задачи, одна из которых создается с NSNotification в любой момент времени, а затем вызывает некоторый код – GrandSteph