我需要执行三个彼此独立的任务,所以我想同时执行它们。但我需要他们都完成通知另一个对象。AFAIK,*dispatch_apply* 创建并发线程,但它迭代一个集合或一个对象数组并执行相同的任务多个循环,我想为每个线程执行不同的任务。使用GCD可以做我想做的事吗?如果没有,最好的方法应该是什么?
谢谢!
我需要执行三个彼此独立的任务,所以我想同时执行它们。但我需要他们都完成通知另一个对象。AFAIK,*dispatch_apply* 创建并发线程,但它迭代一个集合或一个对象数组并执行相同的任务多个循环,我想为每个线程执行不同的任务。使用GCD可以做我想做的事吗?如果没有,最好的方法应该是什么?
谢谢!
使用dispatch_group
. Concurrency Programming Guide提供了一个示例,还有更多 API也可能对您有所帮助。
使用 创建一个调度组dispatch_group_create
。
将每个“任务”放入组中,方法是使用dispatch_group_async
.
(或者,使用dispatch_group_enter
and手动告诉 GCD 每个任务何时开始和停止dispatch_group_leave
。)
要在组中的所有任务完成后运行一个块,请使用dispatch_group_notify
.
(或者,在您的应用程序设计允许您同步等待的不太可能的情况下,请dispatch_group_wait
改用。)
当你完成了小组,dispatch_release
它。
调度组是您所需要的。查看 GCD 函数。您要做的是创建组和并发队列(或使用标准队列)。将三个操作(块)与 dispatch_group 相关联,然后创建第四个块,并让该块执行 dispatch_group_wait(按内存键入名称),然后当它返回时,它可以向其他对象发布“成功”消息。将等待的块放入任何并发队列中。
我在我的应用程序中正是这样做的。
我知道你问过 GCD,但这NSOperationQueue
是另一种可能性。例如:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 3;
// create my completion operation (which will be added to the queue later, once
// the dependencies with all of the other operations has been established)
NSBlockOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"All done");
}];
// let's add our three operations
NSBlockOperation *operation;
operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"starting task 1");
sleep(5);
NSLog(@"stopping task 1");
}];
[completionOperation addDependency:operation];
[queue addOperation:operation];
operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"starting task 2");
sleep(4);
NSLog(@"stopping task 2");
}];
[completionOperation addDependency:operation];
[queue addOperation:operation];
operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"starting task 3");
sleep(6);
NSLog(@"stopping task 3");
}];
[completionOperation addDependency:operation];
[queue addOperation:operation];
// now let's add the completion operation (which has been configured as dependent
// upon the other operations
[queue addOperation:completionOperation];
有很多不同的方法可以解决这个问题,但这NSOperationQueue
是另一种选择。并发编程指南讨论了所有选项。