0

我有四个操作要做如下

  1. 启动活动指示器。
  2. 做一些计算。(在 bg 线程中)
  3. 将结果保存在 xml 中。(在 bg 线程中)
  4. 停止活动指示器。

现在我在 GCD 中做这些操作如下。

[self showAlert];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    [self calculateValues];

    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
        [utility createXMLWithName:name];

        dispatch_sync(dispatch_get_main_queue(), ^{
            [self hideAlert];
        });
    });
});

我想确认这是在 GCD 中执行此操作的正确方法吗?我需要 bg 中的任务 2 和 3,并且任务 3 应该仅在任务 2 完成后发生。为此,我将任务 2 和 3 放在单独的队列中。

4

2 回答 2

2

我认为它会起作用,但我不确定这是最好的方法。我已经发布了一些关于并发编程的文章,你可能会觉得它对你的问题很有趣,你可以看看。Objective C 中的并发编程

通常,如果您想确保仅在其他线程完成工作后才运行线程,则可以使用:
[NSObject performSelector: onThread: withObject: waintUntilDone:YES]; .

(你可以使用 NSOperation 但它似乎是你需要的开销)

但在你的情况下,我真的不明白为什么你需要任务 3 的第二个后台线程,如果你只想在任务 2 完成时运行它。你不能把任务 2 然后 3 做对吗?

于 2012-11-22T11:33:32.890 回答
1

是的,这很好。请注意,如果您的应用程序在正常或高优先级队列中始终处于活动状态,您的createXMLWithName:调用可能会大大延迟,并且您可能会积压保存​​操作。除非您看到实际的性能问题,否则将单个块分派到计算和保存数据的正常优先级队列可能是最安全的。

于 2012-11-22T17:38:53.107 回答