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

标签 iphone objective-c ios grand-central-dispatch

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

相关文章:

iphone - Three20 monotouch/btouch 示例?

ios - 使用 UTC 时间获取 [NSDate 日期]

objective-c - Xcode 中的 NSObject 描述和自定义摘要

objective-c - 使自动旋转工作的最少步骤

iOS GCD自定义并发队列执行顺序

javascript - Cordova/Phonegap 找不到 Assets

ios - 如何检测 iOS 应用程序是否正在越狱手机上运行?

iphone - iPhone应用程序在运行中或启动期间崩溃

ios - 从多个实体中获取数据,它们之间没有关系

ios - 筛选在 CoreData 中保存为字符串的日期