3

我需要执行三个彼此独立的任务,所以我想同时执行它们。但我需要他们都完成通知另一个对象。AFAIK,*dispatch_apply* 创建并发线程,但它迭代一个集合或一个对象数组并执行相同的任务多个循环,我想为每个线程执行不同的任务。使用GCD可以做我想做的事吗?如果没有,最好的方法应该是什么?

谢谢!

4

3 回答 3

6

使用dispatch_group. Concurrency Programming Guide提供了一个示例,还有更多 API也可能对您有所帮助。

  • 使用 创建一个调度组dispatch_group_create

  • 将每个“任务”放入组中,方法是使用dispatch_group_async.

    (或者,使用dispatch_group_enterand手动告诉 GCD 每个任务何时开始和停止dispatch_group_leave。)

  • 要在组中的所有任务完成后运行一个块,请使用dispatch_group_notify.

    (或者,在您的应用程序设计允许您同步等待的不太可能的情况下,请dispatch_group_wait改用。)

  • 当你完成了小组,dispatch_release它。

于 2012-12-09T19:25:55.833 回答
4

调度组是您所需要的。查看 GCD 函数。您要做的是创建组和并发队列(或使用标准队列)。将三个操作(块)与 dispatch_group 相关联,然后创建第四个块,并让该块执行 dispatch_group_wait(按内存键入名称),然后当它返回时,它可以向其他对象发布“成功”消息。将等待的块放入任何并发队列中。

我在我的应用程序中正是这样做的。

于 2012-12-09T19:27:58.370 回答
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是另一种选择。并发编程指南讨论了所有选项。

于 2012-12-12T06:42:16.153 回答