0

我有一个架构,它从麦克风获取输入,然后执行一些计算,然后渲染到屏幕上。

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

最好的方法是什么?

创建一个串行队列并使用 GCD 将工作分派到这个后台队列,然后将最终的 setNeedsDisplay 分派回主队列,或者有更有效的方法吗?

4

3 回答 3

0

创建一个串行队列并使用 GCD 将工作分派到这个后台队列,然后将最终的 setNeedsDisplay 分派回主队列,或者有更有效的方法吗?

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

完成处理程序需要在主线程上调用 setNeedsDisplay。您可以通过发送performSelectorOnMainThread:withObject:waitUntilDone:到视图来做到这一点,例如

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

我认为这是一种比直接使用 GCD 更好的方法,因为它更符合 Objective-C 的习惯用法,它将你正在做的工作与最后的通知分开,并为你提供了比原始 GCD 更多的选项来完成事情。例如,如果您希望其中几件事情顺序发生,您可以使一些操作依赖于其他操作,而无需编写大量代码。

于 2013-05-02T12:40:10.343 回答
0

...使用 GCD 处理这个后台队列并将最终的 setNeedsDisplay 分派回主队列,或者有更有效的方法吗?

根据您相当模糊的描述,我会说您建议的是最好的方法。

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

于 2013-05-02T10:56:18.923 回答
0

让一切都远离主线程。我认为这是最好的。长时间运行的计算也很重要

尽量不要阻塞 UIThread

于 2013-05-01T09:07:50.227 回答