我有一个架构,从麦克风接收输入,然后执行一些计算,然后应该渲染到屏幕。
问题是调用setNeedsDisplay
永远不会触发对drawRect的调用,因为主线程正在运行计算。
最好的方法是什么?
创建单个串行队列并使用GCD将工作分派到此后台队列,并将最终的setNeedsDisplay调度回主队列,还是有更有效的方法来执行此操作?
答案 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。例如,如果你想要按顺序发生这些事情,你可以在不必编写大量代码的情况下使其他操作依赖。