gpt4 book ai didi

ios - 在 dispatch_async 之后顺序调用代码

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:11:30 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

Quoting the docs

A dispatch barrier allows you to create a synchronization point within a concurrent dispatch queue. When it encounters a barrier, a concurrent queue delays the execution of the barrier block (or any further blocks) until all blocks submitted before the barrier finish executing. At that point, the barrier block executes by itself. Upon completion, the queue resumes its normal execution behavior.

关于ios - 在 dispatch_async 之后顺序调用代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18315614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com