我的问题很简单。我有3个任务,一个由NSNotification触发。 如何在继续之前等待所有任务完成。
到目前为止,我尝试使用调度组但无法找到添加由NSNotification触发的任务的方法。 (我尝试在NSNotification触发的方法中添加dispatch命令,但如果通知在任务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 :(得分: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。它几乎可以控制并且能够取消。
答案 1 :(得分: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);}
瞧。谢谢大家。