我正在iOS中进行一些自定义,我正在子类化一个异步执行方法的系统类(大概是使用dispatch_async) 示例代码:
-(void)originalAsyncMethod {
[super originalAsyncMethod];
dispatch_async(dispatch_get_main_queue(), ^{
//do something that needs to happen just after originalAsyncMethod finishes executing
});
}
有没有办法可以确保我的自定义代码在执行异步超级方法后运行?
答案 0 :(得分:2)
根据你的问题,我不清楚这是否可行,但如果你可以直接访问super的实现,那么这应该不难实现。
首先,假设您可以访问超类并且超级实现也异步调度到主队列,那么您实际上不需要做任何事情来实现预期的工作。当您使用dispatch_get_main_queue()
时,您将调度块添加到以FIFO(先进先出)顺序执行的主线程上的串行队列的末尾。
第二个选项也非常依赖于访问超级实现,因为它需要您手动创建自己的调度队列来执行任务。我认为不用说,如果你使用串行调度队列,那么你在此队列中的FIFO排序与dispatch_get_main_queue()
相同,只有你不必在主线程上执行。
我能想到的最后一个选项不一定要求你修改超类,但是需要你知道super正在执行的队列。 (如果它是一个全局队列,仍然可能无法正常工作)通过使用dispatch_barrier,您可以允许您的超级实现在并发队列上异步执行,因为知道子类调度块也已添加到队列中(通过dispatch_barrier),并且将在超级调度(以及之前提交到队列的任何其他提交)完成后执行。
调度屏障允许您在其中创建同步点 并发调度队列。遇到障碍时,a 并发队列延迟了阻塞块(或任何阻塞块)的执行 进一步阻止)直到障碍完成前提交的所有块 执行。此时,屏障块自行执行。上 完成后,队列恢复正常执行行为。