如何拆除GCD队列?

时间:2012-10-05 14:01:46

标签: ios opengl-es concurrency grand-central-dispatch

我有一个GCD绘图队列来更新我的OpenGL ES场景,其结构如下:

- (void)drawFrame {
    dispatch_async(drawingQueue, ^{
        if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0) {
            return;
        }

        @autoreleasepool {
            [self startDrawing];

            // drawing code

            [self endDrawing];
        }

        dispatch_semaphore_signal(frameRenderingSemaphore);
    });
}

当应用程序重新启动或进入后台(两者)时,我通过使CADisplayLink无效来停止OpenGL绘图运行循环。

然而问题是dispatch_asyn甚至在CADisplayLink失效之后才调度绘图块。当用户按下主页按钮时,我的应用程序崩溃,因为它试图在OpenGL中绘制一个框架,即使iOS已经拆除了上下文。

有没有办法杀死/暂停GCD队列,所以它不再发送任何东西?

1 个答案:

答案 0 :(得分:2)

我认为最简单的方法是在执行块之前检查应用程序中的标志。例如:

- (void)drawFrame {
    dispatch_async(drawingQueue, ^{

        if (appIsTerminated || appIsInBackground) {
            return;
        }

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

        @autoreleasepool {
            [self startDrawing];

            // drawing code

            [self endDrawing];
        }

        dispatch_semaphore_signal(frameRenderingSemaphore);
    });
}

您可以在applicationDidEnterBackgroundapplicationWillTerminate中的应用代理中设置这些值。

你也可以试试这个:

dispatch_suspend(drawingQueue);
dispatch_release(drawingQueue);

虽然不太确定。

以下是所有细节:https://developer.apple.com/library/mac/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html