在dispatch_async之后按顺序调用代码

时间:2013-08-19 13:55:38

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

我正在iOS中进行一些自定义,我正在子类化一个异步执行方法的系统类(大概是使用dispatch_async) 示例代码:

-(void)originalAsyncMethod {
    [super originalAsyncMethod];
    dispatch_async(dispatch_get_main_queue(), ^{
      //do something that needs to happen just after originalAsyncMethod finishes executing
    });
  }

有没有办法可以确保我的自定义代码在执行异步超级方法后运行?

1 个答案:

答案 0 :(得分:2)

根据你的问题,我不清楚这是否可行,但如果你可以直接访问super的实现,那么这应该不难实现。

首先,假设您可以访问超类并且超级实现也异步调度到主队列,那么您实际上不需要做任何事情来实现预期的工作。当您使用dispatch_get_main_queue()时,您将调度块添加到以FIFO(先进先出)顺序执行的主线程上的串行队列的末尾。

第二个选项也非常依赖于访问超级实现,因为它需要您手动创建自己的调度队列来执行任务。我认为不用说,如果你使用串行调度队列,那么你在此队列中的FIFO排序与dispatch_get_main_queue()相同,只有你不必在主线程上执行。

我能想到的最后一个选项不一定要求你修改超类,但是需要你知道super正在执行的队列。 (如果它是一个全局队列,仍然可能无法正常工作)通过使用dispatch_barrier,您可以允许您的超级实现在并发队列上异步执行,因为知道子类调度块也已添加到队列中(通过dispatch_barrier),并且将在超级调度(以及之前提交到队列的任何其他提交)完成后执行。

Quoting the docs

  

调度屏障允许您在其中创建同步点   并发调度队列。遇到障碍时,a   并发队列延迟了阻塞块(或任何阻塞块)的执行   进一步阻止)直到障碍完成前提交的所有块   执行。此时,屏障块自行执行。上   完成后,队列恢复正常执行行为。