Grand Central Dispatch和并发任务

时间:2012-12-09 19:04:04

标签: ios multithreading concurrency grand-central-dispatch

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

谢谢!

3 个答案:

答案 0 :(得分:6)

使用dispatch_groupConcurrency Programming Guide给出了一个示例,more API也可能对您有帮助。

  • 使用dispatch_group_create创建一个调度组。
  • 使用dispatch_group_async将每个“任务”放入组中。

    (或者,使用dispatch_group_enterdispatch_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讨论了所有选项。