由于活动主线程而未调用DrawRect

时间:2013-05-01 09:04:43

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

我有一个架构,从麦克风接收输入,然后执行一些计算,然后应该渲染到屏幕。

问题是调用setNeedsDisplay永远不会触发对drawRect的调用,因为主线程正在运行计算。

最好的方法是什么?

创建单个串行队列并使用GCD将工作分派到此后台队列,并将最终的setNeedsDisplay调度回主队列,还是有更有效的方法来执行此操作?

3 个答案:

答案 0 :(得分:0)

让一切都在主线程上运行。在我看来这是最好的。长时间运行的计算也是

尝试永远不会阻止UIThread

答案 1 :(得分:0)

  

...使用GCD工作到此后台队列并发送最终版本   setNeedsDisplay回到主队列,或者是否更高效   这样做的方式?

基于你非常模糊的描述,我会说你建议的是最好的方法。

如果您使用GCD执行此操作,您的代码将易于阅读,因为您执行的工作块在您的代码中是内联的,以便于理解正在发生的事情。

答案 2 :(得分:0)

  

创建单个串行队列并使用GCD将工作分派到此后台队列,并将最终的setNeedsDisplay调度回主队列,还是有更有效的方法来执行此操作?

您应该使用可用的最高级API。在这种情况下,它是NSOperation或其子类之一。可能NSBlockOperation就是你想要的那个。你应该

完成处理程序需要在主线程上调用setNeedsDisplay。您可以通过向视图发送performSelectorOnMainThread:withObject:waitUntilDone:来执行此操作,例如

[myViewThatNeedsUpdating performSelectorOnMainThread: @selector(setNeedsDisplay) 
                                          withObject: nil 
                                       waitUntilDone: NO];

我认为这是一种比直接使用GCD更好的方法,因为它更符合Objective-C惯用法,它将你正在做的工作与最后的通知分开,并为你提供了更多的选择。原始GCD。例如,如果你想要按顺序发生这些事情,你可以在不必编写大量代码的情况下使其他操作依赖。