我正在使用 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/