gpt4 book ai didi

iphone - 使用 Grand Central Dispatch,我如何检查是否有 block 已经在运行?

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

我正在使用 GCD 从 Internet 进行一些后台加载。除了一点点缺陷外,这很好用。在我的应用程序中,我有 3 个选项卡,当单击任何选项卡时,GCD 开始为适当的选项卡进行后台加载。如果用户决定从第一个选项卡转到第二个选项卡(当 GCD 已开始为第一个选项卡下载数据时),然后再次返回到第一个选项卡。 GCD 将启动另一个后台线程(即使第一个后台线程尚未完成数据下载)。

那么有没有办法检查后台线程当前是否正在运行?因此,如果用户选择非常快速地来回切换选项卡(出于某种原因),它不会启动多个后台线程。

最佳答案

如果你想防止两个相同类型的 block 同时运行,你可以使用调度信号量。将信号量设置为 1,您可以在启动 block 之前检查信号量,如果某些东西仍在运行则保释。在 block 的末尾,您发出信号量以允许提交其他 block 。

我在我的一个应用程序中这样做是为了防止一次将多个 OpenGL ES 帧渲染 block 添加到队列中(如果一帧花费的时间超过 1/60 秒,则防止队列中的 block 堆积)使成为)。我在我的回答中描述了其中的一些 here ,使用以下代码:

if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0)
{
return;
}

dispatch_async(openGLESContextQueue, ^{

[EAGLContext setCurrentContext:context];

// Render here

dispatch_semaphore_signal(frameRenderingSemaphore);
});

前面创建的frameRenderingSemaphore如下:

frameRenderingSemaphore = dispatch_semaphore_create(1);

如果您为每个选项卡的下载操作创建一个类似的信号量,您可以进行检查以确保该选项卡没有同时排队等待多个下载。

关于iphone - 使用 Grand Central Dispatch,我如何检查是否有 block 已经在运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6694439/

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