2010-03-10 48 views
0

我知道要使用UIActivityIndi​​cator,你必须在主线程中启动它,然后在后台线程上执行长时间运行的操作。我也明白,所有的UIKit操作也应该在主线程上完成。在Quartz绘图操作期间的UIActivityIndi​​cator

但是我现在面临的是使用Quartz CGContext绘图方法创建CALayer的长时间运行操作,我想知道是否可以在后台线程中执行Quartz东西,以便我可以显示活动指标,而我的复杂图形正在绘制?

我很新的Quartz,不得不承认我很容易在这个领域迷路。我希望它与UIKit有足够的差异来允许后台上下文绘制操作。

回答

0

您不使用Quartz CGContext绘图方法创建CALayers。您使用CGContext绘图方法将绘制成CALayers。这发生在运行循环的绘图阶段时,它调用drawInContext:,并且您无法控制发生在哪个线程上(或甚至是真的发生)。你想保持尽可能快的速度,所以对于复杂的图层,你应该尽可能多地进行预先计算,并保存答案,路径等。

我觉得你可能意味着别的什么。你是什​​么意思“创建CALayers?”

+0

是的,我选择了糟糕的话。我已经将所有图层和Quartz绘图工作到了CGContexts中(当它们排列在UIScrollView中时,有几个关闭它们)。 问题是完成drawLayer需要5秒钟或更长时间:inContext:方法,并且我希望在这5秒内有一个活动指示器正在旋转。 我希望我可以在主线程中启动活动指示器,然后触发一个绘制到CGContext中的后台进程。我想我的问题确实是一个Quartz问题。你可以在后台线程中使用CGContext吗? – 2010-03-10 01:08:42

2

分离出NSThread并通过CGBitmapContextCreate将其绘制到您创建的上下文中。完成后,使用-[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]将您从CGBitmapContextCreateImage获得的图像发送回主线程以分配到CALayercontents属性。确保您的绘图代码是线程安全的。

+0

+1这是你想要的一种方法。 -drawLayer:inContext:*不能*运行5秒。您无法控制它何时运行,并且可能会运行多次。在别的地方做这项工作,然后将它应用到图层上。 – 2010-03-10 15:03:04

相关问题