使用后台线程更新UI的理想方法是
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//Background Thread
dispatch_async(dispatch_get_main_queue(), ^(void){
//Run UI Updates
});
});
但是,即使不使用主队列,我们也可以更新UI
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//Background Thread
//Run UI Updates
});
因此,我正在使用beizer路径绘制一些点,这些点来自iPad UIPanGestureRecognizer。现在,我在主线程上绘制这些点,并旋转这些点以获取新点,并使用背景线程(并发)绘制这些新点。这是我的代码:
CGPoint touchPoint = [sender locationInView:self.view];
[pencilLayer[0] addPoint:touchPoint];
for(int i = 1; i < 4; i++)
{
dispatch_async(privateQueue, ^{
CGPoint point = Rotatepoint(500, 500, 45(degree), touchPoint);
[pencilLayer[i] addPoint:point];
});
}
我的问题是:主线程和专用队列应同时在UI上绘制。为什么释放手势后,privateQueue在UI上绘制点?
好吧,根据文档,通常最好保留在主线程上操纵UI的代码:
线程和用户界面
如果您的应用程序具有图形用户界面,建议您接收与用户相关的事件,并从应用程序的主线程启动界面更新。这种方法有助于避免与处理用户事件和绘制窗口内容相关的同步问题。某些框架(例如Cocoa)通常需要此行为,但是即使对于那些不需要的框架,在主线程上保留此行为也具有简化用于管理用户界面的逻辑的优势。
现在,在您的特定情况下,这可能正是发生您的情况的确切原因。但是无论如何,在您的特定情况下,我认为没有充分的理由在专用队列上执行绘图。但是出于某些原因,您应该将其保留在主线程上-代码会操纵UI,因此建议将其保留在主线程上(请参见上面的参考)。而且,点图并不是性能上的详尽操作-没有充分的理由将其放在背景上。
因此,我建议删除私有队列上的该调度,并简单地使用以下命令:
CGPoint touchPoint = [sender locationInView:self.view];
[pencilLayer[0] addPoint:touchPoint];
for(int i = 1; i < 4; i++)
{
CGPoint point = Rotatepoint(500, 500, 45(degree), touchPoint);
[pencilLayer[i] addPoint:point];
}
另外,请检查此博客条目中有关线程和UI的信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句