有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,你可能会减慢渲染的速度,因为系统会调用渲染,而不是做其他更有效的事情来呈现视图的内容。