几个dispatch_async如何顺序执行?

时间:2014-05-19 14:10:52

标签: ios ios7 grand-central-dispatch

我有两种方法:

-(void)clear
{
  // some code

  dispatch_async( dispatch_get_global_queue(0,0), 
        ^{
              // async_block_1

         });     
}

-(void)download
{
  // some code

  dispatch_async( dispatch_get_global_queue(0,0), 
        ^{
              // async_block_2

         });     
}

我需要用第三种方法打电话给他们:

-(void)relosd
{
   [self clear];
   [self download];
}

我如何保证首先执行async_block_1然后执行async_block_2?

很明显,以下代码不能保证:

-(void)reload
{
    dispatch_sync( dispatch_get_global_queue(0,0), 
       ^{
           [self clear];
           [self download];
       });
}

2 个答案:

答案 0 :(得分:3)

可以创建GCD队列以serial queue运行。

只需创建自己的队列:

dispatch_queue_t queue = dispatch_queue_create("com.my.download", NULL);

您可以执行此.m部分,其中您声明了functie:

dispatch_queue_t getDownloadQueue() {
    static dispatch_once_t onceToken;
    static dispatch_queue_t ruleQueue;
    dispatch_once(&onceToken, ^{
        ruleQueue = dispatch_queue_create("com.my.download", NULL);
    });

    return ruleQueue;
}

只需将此代码放在@implementation之外,之后您就可以执行以下操作:

-(void)clear {
  // some code
  dispatch_async( getDownloadQueue(), ^{
    // async_block_1
  });     
}

-(void)download {
  // some code

  dispatch_async(getDownloadQueue(), ^{
    // async_block_2
  });     
}

如果你只需要你的一个实例中的队列然后使用一个属性,这个例子将创建一个你可以在整个应用程序中使用的队列,并确保它们按顺序执行。

答案 1 :(得分:2)

你可能正在追求rckoenes的建议,但你的其他选择是。

  • 使用NSOperationQueue并设置依赖项
  • 使用NSOperationQueue并设置maxConcurrentOperationCount
  • 使用dispatch_barrier_async代替dispatch_async