2017-09-06 175 views
1

我们都在后台进行一些冗长的操作时显示活动指标。尽管活动指示器显示一个不断旋转的轮子,但它不会给主线程带来负担,因为同一屏幕上的其他UIComponents仍会对触摸做出反应。为什么不断的动画UIActivityIndi​​cator不会阻塞主线程?

我觉得我所知道的:

我知道所有的触摸事件是由主线程处理,和主队列被用来排队的事件。考虑到主队列是序列化队列,每次只有一个任务可以在任何时间点运行,同时触摸事件应该在主队列中排队,而我的主线程忙于刷新UIActivityIndi​​cator的屏幕/调用drawrect。

研究:

我已经调查的第三方活动指标的代码。他们中的大多数使用CABasicAnimation并且在动画上总是重复重复。虽然很少工作直接使用NSTimer以较小的延迟重复呼叫drawrect。他们的代码是有效的,因为调用drawrect有一个小小的延迟,而方法drawrect本身重量轻。

无它不会采取负载关闭主线程,而是他们小心地放置在主线程负载足以让他们去动画还保持主线程自由地处理触摸事件

我想什么知道:

1 - 该策略是否实施活动指标是正确的?或者像这样的语句

self.timer =[NSTimer timerWithTimeInterval:0.1 target:self 
selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES]; 
     [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; 

在我看到的第三方活动指标中有什么特殊效果?

2 - 如果我运行CABasicAnimation/transaction并重复动画,永久会对主线程的负载有什么特殊效果,而不是手动重复调用setNeedsDispaly/drawrect?

+0

你想通过定期调用'setNeedsDisplay'实现什么功能?这没有任何意义。 –

+0

假设我想要根据进度量/任何进度动画旋转/加载不同图像的图像我想要执行大部分第三方框架在UIView的drawRect方法中处理这些事情并且为了触发drawRect他们调用setNeedsDisplay –

+0

@downvoter:只是因为你不明白这个问题并没有使你有资格对这个问题投下赞成票。如果你不明白的问我,如果你在这里知道答案评论 –

回答

1

我不确定它是否有助于实现您自己的活动指标,但系统UIActivitiyIndicatorView只是一个UIImageView,其中12个图像阵列可以随时间相互替换。

UIActivityIndicatorView

苹果公司使他们的微调分立作出了相当巧妙的技巧。它允许他们有一个简单的实现,不会在CPU上创建任何计算负载。

UPD

返回到你想知道的事情: - 这不是,因为在drawRect实现手动框架图由CPU完全完成。 - 我不能肯定地说,但如果有人相信苹果在文档和视频中所说的Core Animation,它会进行大量优化,并在底部运行Metal或至少OpenGL,因此可以充分利用GPU的强大功能。

+0

我已经使用这个技巧,并使用CADisplayLink来刷新页面而不是使用NSTimer是一个整洁的技巧。所有我试图理解的是,使用CADisplayLink/NSTimer调用setNeedsDisplay/drawRect最终增加主线程的负担只有没有?所以这一切都归结于我们在drawRect或我们的任何实际做动画的方法中。如果该方法的计算量很大,那么UI将会正确挂起?我想知道是否有像使用Runloop那样的出路,在那里我不会让主线程负担加重。我相信现在没有其他方式 –

+0

感谢您的回放:)非常感谢:)我同意图像替换技巧,因此+1。因为它只是部分回答我的问题,所以我会等一会儿才能接受更好的回答:) –

+1

没问题。我已经添加了一些澄清,也许这会对您的研究有所帮助。祝你好运! – Zapko

相关问题