Pet*_*rbo 2 iphone objective-c grand-central-dispatch ios
我正在使用GCD从互联网上进行一些后台加载.除了有点瑕疵之外,这很有效.在我的应用程序中,我有3个选项卡,当单击任何选项卡时,GCD开始为相应的选项卡执行后台加载.如果用户决定从第一个选项卡转到第二个选项卡(当GCD开始下载第一个选项卡的数据时),然后再次返回第一个选项卡.GCD将启动另一个后台线程(即使第一个后台线程尚未完成下载数据).
那么有没有办法检查后台线程当前是否正在运行?因此,如果用户选择非常快速地来回切换标签(由于某种原因),它就不会启动多个后台线程.
Bra*_*son 10
如果要防止同一类型的两个块同时运行,可以使用调度信号量.将信号量设置为1,您可以在关闭块之前检查信号量,并在某些事情仍在运行时保释.在块结束时,您发信号通知信号量以允许提交其他块.
我在我的一个应用程序中执行此操作,以防止一次将多个OpenGL ES帧渲染块添加到队列中(如果帧花费的时间超过1/60秒,则阻止在队列中累积块).我在这里的答案中描述了一些,使用以下代码:
if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0)
{
return;
}
dispatch_async(openGLESContextQueue, ^{
[EAGLContext setCurrentContext:context];
// Render here
dispatch_semaphore_signal(frameRenderingSemaphore);
});
Run Code Online (Sandbox Code Playgroud)
其中frameRenderingSemaphore较早创建如下:
frameRenderingSemaphore = dispatch_semaphore_create(1);
Run Code Online (Sandbox Code Playgroud)
如果为每个选项卡的下载操作创建类似的信号量,则可以进行检查以确保一次不为该选项卡排队多个下载.