我们都显示活动指标,而一些冗长的操作正在后台发生。虽然活动指示器显示一个不断旋转的轮子,但它不会给主线程带来负担,因为同一屏幕中的其他UIComponents
仍会对触摸作出反应。
我想我知道:
我知道所有触摸事件都由主线程处理,主队列用于对事件进行排队。考虑到主队列是序列化队列,并且一次只能有一个任务可以在任何给定时间点运行,小巷触摸事件应该在主队列中排队,而我的主线程忙于刷新UIActivityIndicator的屏幕/调用画面。 / 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相比,它对主线程的加载有任何特殊效果吗?
答案 0 :(得分:2)
我不确定它是否有助于实施您自己的活动指标,但系统UIActivitiyIndicatorView
只是一个UIImageView
,其中包含12个图像的数组,这些图像会随着时间的推移相互替换。
<强> UPD 强>
回到你想知道的事情:
1 - 它不是,因为在drawRect
中实现手动框架绘图完全由CPU完成。并且 2 - 我无法肯定地说,但如果有人相信Apple在文档和视频中对Core Animation
所说的话,它会进行大量优化,并在Metal
或至少OpenGL
下面,所以利用GPU的力量。