我有一个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队列,所以它不再发送任何东西?
答案 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);
});
}
您可以在applicationDidEnterBackground
和applicationWillTerminate
中的应用代理中设置这些值。
你也可以试试这个:
dispatch_suspend(drawingQueue);
dispatch_release(drawingQueue);
虽然不太确定。