为什么不断动画UIActivityIndi​​cator不会阻止主线程?

时间:2017-09-06 07:15:38

标签: ios animation uiactivityindicatorview

我们都显示活动指标,而一些冗长的操作正在后台发生。虽然活动指示器显示一个不断旋转的轮子,但它不会给主线程带来负担,因为同一屏幕中的其他UIComponents仍会对触摸作出反应。

我想我知道:

我知道所有触摸事件都由主线程处理,主队列用于对事件进行排队。考虑到主队列是序列化队列,并且一次只能有一个任务可以在任何给定时间点运行,小巷触摸事件应该在主队列中排队,而我的主线程忙于刷新UIActivityIndi​​cator的屏幕/调用画面。 / p>

研究:

我查看了第三方活动指标的代码。他们中的大多数使用CABasicAnimation并且总是在动画上调用repeat。虽然很少有工作直接使用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相比,它对主线程的加载有任何特殊效果吗?

1 个答案:

答案 0 :(得分:2)

我不确定它是否有助于实施您自己的活动指标,但系统UIActivitiyIndicatorView只是一个UIImageView,其中包含12个图像的数组,这些图像会随着时间的推移相互替换。

UIActivityIndicatorView

通过让他们的旋转器离散,Apple做了一个非常巧妙的技巧。它允许他们有一个简单的实现,不会在CPU上产生任何计算负荷。

<强> UPD

回到你想知道的事情: 1 - 它不是,因为在drawRect中实现手动框架绘图完全由CPU完成。并且 2 - 我无法肯定地说,但如果有人相信Apple在文档和视频中对Core Animation所说的话,它会进行大量优化,并在Metal或至少OpenGL下面,所以利用GPU的力量。