2

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

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

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

4

1 回答 1

2

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

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

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

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

引用文档

调度屏障允许您在并发调度队列中创建同步点。当遇到屏障时,并发队列会延迟屏障块(或任何其他块)的执行,直到在屏障之前提交的所有块都完成执行。此时,屏障块自行执行。完成后,队列恢复其正常执行行为。

于 2013-08-19T14:17:32.997 回答