2012-11-22 48 views
0

的使用,我有四个运算如下澄清大中央调度

  1. 开始actvityindicator来完成。
  2. 做一些caclulations。 (在bg线程中)
  3. 将结果保存为xml。(在bg线程中)
  4. 停止actvityindicator。

现在我正在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放在单独的队列中。

回答

2

我认为它会工作,但我不确定这是最好的方法。 我发布了一些关于并发编程的文章,你可能会发现它对你有意思,你可以看看。 concurrency programming in objective C

一般来说,如果你想确保你只运行后,其他线程完成他的工作,你可以用你的线程:
[NSObject的performSelector:onThread:withObject:waintUntilDone:YES]; 。

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

但在你的情况我真的不明白为什么你需要第二个后台线程任务3,如果你想运行它只有当任务2完成时。 难道你不能正确的任务2,然后3.

1

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