【问题标题】:Grand Central Dispatch and concurrent tasksGrand Central Dispatch 和并发任务
【发布时间】:2012-11-27 06:16:23
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: ios multithreading concurrency grand-central-dispatch


    【解决方案1】:

    我知道你问过 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 讨论了所有选项。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        使用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 它。

        【讨论】:

        • 与此相关...如果我从一个应该返回值的方法中分派组,我需要在达到 'dispatch_group_notify' 时执行此操作?
        • 如果您的方法需要返回一个取决于组中任务的值,那么dispatch_group_wait 将是合适的。
        猜你喜欢
        • 2011-07-28
        • 2012-05-09
        • 1970-01-01
        • 2023-03-07
        • 2023-03-25
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        相关资源
        最近更新 更多