我有一个架构,它从麦克风获取输入,然后执行一些计算,然后渲染到屏幕上。
问题是调用setNeedsDisplay
永远不会触发对 drawRect 的调用,因为主线程正在运行计算。
最好的方法是什么?
创建一个串行队列并使用 GCD 将工作分派到这个后台队列,然后将最终的 setNeedsDisplay 分派回主队列,或者有更有效的方法吗?
我有一个架构,它从麦克风获取输入,然后执行一些计算,然后渲染到屏幕上。
问题是调用setNeedsDisplay
永远不会触发对 drawRect 的调用,因为主线程正在运行计算。
最好的方法是什么?
创建一个串行队列并使用 GCD 将工作分派到这个后台队列,然后将最终的 setNeedsDisplay 分派回主队列,或者有更有效的方法吗?
创建一个串行队列并使用 GCD 将工作分派到这个后台队列,然后将最终的 setNeedsDisplay 分派回主队列,或者有更有效的方法吗?
您应该使用可用的最高级别 API。在这种情况下,它是 NSOperation 或其子类之一。可能,NSBlockOperation是您想要的。你应该
完成处理程序需要在主线程上调用 setNeedsDisplay。您可以通过发送performSelectorOnMainThread:withObject:waitUntilDone:到视图来做到这一点,例如
[myViewThatNeedsUpdating performSelectorOnMainThread: @selector(setNeedsDisplay)
withObject: nil
waitUntilDone: NO];
我认为这是一种比直接使用 GCD 更好的方法,因为它更符合 Objective-C 的习惯用法,它将你正在做的工作与最后的通知分开,并为你提供了比原始 GCD 更多的选项来完成事情。例如,如果您希望其中几件事情顺序发生,您可以使一些操作依赖于其他操作,而无需编写大量代码。
...使用 GCD 处理这个后台队列并将最终的 setNeedsDisplay 分派回主队列,或者有更有效的方法吗?
根据您相当模糊的描述,我会说您建议的是最好的方法。
如果您使用 GCD 执行此操作,您的代码将易于阅读,因为您执行的工作块是内联在代码中的,因此很容易理解正在发生的事情。
让一切都远离主线程。我认为这是最好的。长时间运行的计算也很重要
尽量不要阻塞 UIThread