使用Blocks和GCD来管理任务

时间:2013-09-19 15:51:32

标签: ios objective-c-blocks grand-central-dispatch

我正在学习iOS,当谈到GCD时,它让人感到困惑。 让我们把它弄清楚,我正在编写一个从互联网上获取数据的小程序。 这是我的viewcontroller

NSMutableArray dataArray = [NSMutableArray array];

[querysomethingwithblock:(^ {
   //do some stuff here
   [otherquerywithblock:( ^ {
       //do some stuff here
       // Here I got the data from internet
       // Do loop action
       [dataArray addObject:data];
   })];


})];
// here I want to perform some actions only after get data from internet
[self performAction:dataArray];

我怎样才能达到这个目的。实际上,[self performAction:dataArray]总是在我获取数据之前被解雇。我试着玩GCD但没有运气。

以下是我到目前为止尝试的一些模式

dispatch_async(queue, ^{
    // Do query stuff here
    dispatch_async(dispatch_get_mainqueue(), ^{
       //perform action here
    });
{;

或使用dispatch_group_asyncdispatch_group_waitdispatch_group_notify

我现在能够处理的唯一方法是使用dispatch_after,但关键是下载时间是可变的,在这里有一个特定的时间是不好的做法

非常感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

我认为名为Do query stuff here的代码部分已经异步,为什么要把它放在dispatch_queue中呢?

如果您设法执行同步查询,则您的代码(第二个代码段)将起作用,因为只有在查询完成后才会执行对主队列的调度。

如果您没有以同步方式执行查询的选项,那么您需要一些机制来注册下载完成时要执行的块或回调。

在一天结束时,这完全取决于您在那里的查询类型以及它为您提供了在下载完成时注册要执行的操作的方法。