有UIView drawRect发生在后台线程中

我想有一个UIView子类实现类似于setNeedsDisplay的方法,除了重画(即,通常会通过drawRect:调用)将在后台线程中发生,而不是在当前的更新周期结束。

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

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

这些线路是否合理可行?

谢谢!

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

所以,当您的背景正在生成的图像,你可以通过渲染的图像显示图像的正确function,提供的图像已经生成。

展示如何执行此操作的WWDCvideo: 在IOS上构build并发用户界面 。 这是video说明:

为了获得绝佳的用户体验,在呈现复杂的UI元素和处理数据时保持应用程序响应是非常重要的。 学习如何在UIKit层使用并发性来执行绘制和其他常见操作,而不会阻止用户交互。

编号查看绘图必须在前台进行。 苹果在他们的文档中非常清楚。

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

我会build议不要试图覆盖setNeedsDisplay。 相反,请添加新的setNeedsAsynchronousDisplay方法。 在该方法中,使用GCD调用将代码队列渲染到asynchronous队列。 渲染完成后,渲染代码会在主线程上发送setNeedsDisplay消息给self。

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

不利的一面是,仅仅通过实现drawRect,你可能会减慢渲染的速度,因为系统会调用渲染,而不是做其他更有效的事情来呈现视图的内容。