1

我有一个 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 绘图运行循环。

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

有没有办法杀死/暂停 GCD 队列,使其不再分派任何东西?

4

1 回答 1

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

于 2012-10-05T14:48:04.120 回答