我正在使用 GCD 从互联网上进行一些后台加载。除了一点缺陷之外,这效果很好。在我的应用程序中,我有 3 个选项卡,当单击任何选项卡时,GCD 开始为相应的选项卡进行后台加载。如果用户决定从第一个选项卡转到第二个选项卡(当 GCD 已开始下载第一个选项卡的数据时),然后再次返回到第一个选项卡。 GCD 将启动另一个后台线程(即使第一个后台线程尚未完成数据下载)。
那么有没有办法检查后台线程当前是否正在运行?这样,如果用户选择非常快速地来回切换选项卡(出于某种原因),它就不会启动多个后台线程。
如果你想阻止两个相同类型的块同时运行,你可以使用调度信号量。将信号量设置为 1 后,您可以在触发块之前检查信号量,并在某些内容仍在运行时进行保释。在块的末尾,您向信号量发出信号以允许提交其他块。
我在我的一个应用程序中执行此操作是为了防止一次将多个 OpenGL ES 帧渲染块添加到队列中(如果一帧渲染时间超过 1/60 秒,则防止队列中的块堆积)。我在回答中描述了其中一些内容here,使用以下代码:
if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0)
{
return;
}
dispatch_async(openGLESContextQueue, ^{
[EAGLContext setCurrentContext:context];
// Render here
dispatch_semaphore_signal(frameRenderingSemaphore);
});
where frameRenderingSemaphore
之前创建的如下:
frameRenderingSemaphore = dispatch_semaphore_create(1);
如果您为每个选项卡的下载操作创建一个类似的信号量,则可以进行检查以确保该选项卡一次不会有多个下载排队。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)