派遣组和NSNotification

时间:2015-06-15 17:53:32

标签: objective-c grand-central-dispatch nsnotificationcenter nsnotification

我的问题很简单。我有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!
});

2 个答案:

答案 0 :(得分:0)

我建议您改用NSOperationNSOperationQueue。您可以将所有操作作为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);}

瞧。谢谢大家。