我需要执行三个彼此独立的任务,所以我想同时执行它们。但我需要他们所有人完成通知另一个对象。 AFAIK,* dispatch_apply *创建并发线程,但它迭代一个集合或一个对象数组,并执行相同的任务多个循环,我想为每个线程执行不同的任务。使用GCD可以做我想做的事吗?如果不是,最好的方法是什么?
谢谢!
答案 0 :(得分:6)
使用dispatch_group
。 Concurrency Programming Guide给出了一个示例,more API也可能对您有帮助。
dispatch_group_create
创建一个调度组。使用dispatch_group_async
将每个“任务”放入组中。
(或者,使用dispatch_group_enter
和dispatch_group_leave
,在每项任务开始和结束时手动告诉GCD。)
要在群组中的所有任务完成后运行阻止,请使用dispatch_group_notify
对其进行排队。
(或者,在您的应用程序设计允许您同步等待的情况下,请改用dispatch_group_wait
。)
dispatch_release
。答案 1 :(得分:4)
调度组是您所需要的。看看GCD功能。您要做的是创建组和并发队列(或使用标准队列)。将三个操作(块)与dispatch_group相关联,然后创建第四个块,并使该块执行dispatch_group_wait(按内存键入名称),然后在返回时,它可以将“成功”消息发布到其他对象。将带有wait的块放入任何并发队列。
我在我的应用中做到了这一点。
答案 2 :(得分:4)
我知道你问过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
是另一种选择。 Concurrency Programming Guide讨论了所有选项。