繁体   English   中英

几个dispatch_async如何顺序执行?

[英]How a several dispatch_async to execute sequentially?

我有2种方法:

-(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];
       });
}

可以创建GCD队列以作为串行队列运行。

只需创建自己的队列:

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

您可以在声明函数的地方执行.m部分,例如:

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
  });     
}

如果仅在类的一个实例中需要队列,然后使用属性,则此示例将创建一个队列,您可以在整个应用程序中使用该队列,并确保它们按顺序执行。

您可能会遵循rckoenes的建议,但其他选择却是。

  • 使用NSOperationQueue并设置依赖项
  • 使用NSOperationQueue并设置maxConcurrentOperationCount
  • 使用dispatch_barrier_async而不是dispatch_async

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM