6

我希望有一个UIView实现类似于 的方法的子类setNeedsDisplay,除了重绘(即通常称为 via drawRect:)将很快发生在后台线程中,而不是在当前更新周期结束时。

它可能被称为setNeedsAsynchronousDisplay. 或者现有的setNeedsDisplay可能会被劫持并且不会在循环结束时导致重绘,或者其他什么,只要它让重绘不会发生在主线程阻塞屏幕上,更新交互直到完成。

在重绘发生之前,视图可以继续使用其当前绘制的表示。

这些方面的事情是否合理可行?

谢谢!

4

2 回答 2

12

对的,这是可能的。您可能需要在背景中将内容视图生成为图像并将图像推送到 nsdictionary 或数组中。

因此,当您的背景生成图像时,您可以通过渲染图像在 drawrect 函数中显示图像,前提是图像已经生成。

展示如何操作的 WWDC 视频:WWDC 2012 session 211 - Building Concurrent User Interfaces on IOS。以下是视频说明:

为了获得出色的用户体验,在呈现复杂的 UI 元素和处理数据时保持应用程序的响应性至关重要。了解如何在 UIKit 层使用并发来执行绘图和其他常见操作,而不会阻塞用户交互。

于 2014-01-15T14:06:27.377 回答
-3

不可以。视图绘图必须出现在前台。Apple 在他们的文档中非常清楚地说明了这一点。

编辑:你是对的,只要不在 UIView 对象的绘图方法中,你就可以在后台进行核心图形绘图。您必须在后台进行绘图,然后在绘图完成后向主线程发送消息以更新您的视图对象。

我建议不要尝试覆盖 setNeedsDisplay。相反,添加新的 setNeedsAsynchronousDisplay 方法。在该方法中,使用 GCD 调用将渲染代码排入异步队列。渲染完成后,让渲染代码在主线程上向 self 发送 setNeedsDisplay 消息。

然后在您的子类的 drawRect 方法中,检查预渲染图像并将其绘制到视图的上下文中,而不是普通代码。

这样做的一个缺点是,仅通过实现 drawRect,您可能会减慢渲染速度,因为系统调用它而不是执行其他更有效的事情来渲染视图的内容。

于 2014-01-15T14:00:41.413 回答