Objective c 调度组和通知

Objective c 调度组和通知,objective-c,grand-central-dispatch,nsnotificationcenter,nsnotification,Objective C,Grand Central Dispatch,Nsnotificationcenter,Nsnotification,我的问题很简单。我有3个任务,一个由NSN通知触发。 如何在继续之前等待所有任务完成 到目前为止,我尝试使用dispatch group,但找不到添加由NSNotification触发的任务的方法。(我尝试在NSNotification触发的方法中添加dispatch命令,但如果通知在任务1和任务2之后出现,则添加到组中为时已晚,因为它已完成。) 我建议您改用NSOperation和NSOperationQueue。您可以将所有操作作为一个链接,并等待所有三个操作都完成。然后在最后一个操作的完成

我的问题很简单。我有3个任务,一个由NSN通知触发。 如何在继续之前等待所有任务完成

到目前为止,我尝试使用dispatch group,但找不到添加由NSNotification触发的任务的方法。(我尝试在NSNotification触发的方法中添加dispatch命令,但如果通知在任务1和任务2之后出现,则添加到组中为时已晚,因为它已完成。)


我建议您改用
NSOperation
NSOperationQueue
。您可以将所有操作作为一个链接,并等待所有三个操作都完成。然后在最后一个操作的完成块中执行done处理程序

如果您对它感到困惑,您仍然可以使用dispatch group,但方式略有不同。使用
dispatch\u group\u enter
/
dispatch\u group\u leave
+
dispatch\u group\u wait
。诸如此类:

dispatch\u group\u t waitGroup=dispatch\u group\u create();
调度组输入(等待组);
调度异步(其他队列^{
//长时间运行的代码
派遣组休假(等待组);
}
调度组等待(等待组、调度时间永远);
当一个任务开始运行时调用
dispatch\u group\u enter
,任务完成后调用
dispatch\u group\u leave
。在需要等待所有任务完成的地方调用
dispatch\u group\u wait
不要在主线程中等待!最好为任务创建单独的队列这个


但我鼓励您使用NSOperations。它更易于控制,而且可以取消。

感谢@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);}

瞧。多亏了大家。

尝试了,但我还是遇到了同样的障碍。我如何添加由NSNotification触发的方法?我不太明白您的问题是什么?您希望任务1和2等待NSNotification触发?或者您希望等待3个任务,其中一个任务是在任何时间点使用NSNotification创建的然后调用一些代码?第二个选项,先生!:)我想等待3个任务,其中一个任务是在任何时间点使用NSNotification创建的,然后调用一些代码。好吧,我在这里看到一个合适的和一个不好的解决方案:)1。(好)为第一个和第二个任务创建
NSOperation
。创建等待
NSNotification
NSOperation
。创建另一个
NSOperation
,该操作依赖于将执行完成代码的前三个
NSOperation
s。第三个
NSOperation
应使用
dispatch\u semaphore\u wait
等待信号量。当发生
NSNotification
时-使用
dispatch\u semaphore\u signal
向该信号量发送信号。2.(错误)每次任务结束时,在类中增加一些原子变量。在setter中,检查值3并运行完成代码。我想我的无知可以归结为:“创建等待NSNotification的NSOperation”您可以分享一些这样做的代码片段吗。剩下的我都知道了。同时,我会做不好的选择:)
-(void)methodTriggeredByNotif:(NSNotification *)notification {

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