ios - 为什么不断动画的 UIActivityIndi​​cator 不会阻塞主线程?

标签 ios animation uiactivityindicatorview

当后台发生一些冗长的操作时,我们都会显示事件指示器。尽管事件指示器显示不断旋转的轮子,但它不会给主线程带来负担,因为同一屏幕中的其他 UIComponent 仍然会对触摸使用react。

我认为我知道的:

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

研究:

我研究了第三方事件指标的代码。他们中的大多数使用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 相比,它会对主线程的负载产生任何特殊效果吗?

最佳答案

我不确定它是否有助于实现您自己的事件指示器,但系统一 UIActivitiyIndi​​catorView 只是一个 UIImageView ,其中包含 12 个图像的数组,用于替换随着时间的推移彼此。

UIActivityIndicatorView

苹果公司通过使他们的旋转器分离来实现了一个非常巧妙的技巧。它使他们能够实现一个简单的实现,不会对 CPU 造成任何计算负载。

UPD

回到你想知道的事情: 1 - 不是,因为在 drawRect 中实现手动帧绘制完全由 CPU 完成。 2 - 我不能肯定地说,但如果有人相信苹果在有关 Core Animation 的文档和视频中所说的内容,它会经过严格优化并在 Metal 上运行 或至少在下面的OpenGL,因此可以利用 GPU 的能力。

关于ios - 为什么不断动画的 UIActivityIndi​​cator 不会阻塞主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46069038/

相关文章:

ios - og:url元标记是什么?

html - 如何将文本设置为在动画结束时居中对齐?

javascript - Fabric.js 函数将物体从 A 点移动到 B 点

objective-c - 如何在 UICollectionview 自定义单元格中显示 UI Activityindicator 直到图像在服务器端下载?

ios - 为什么播放时系统不保留一个AVAudio播放器?

ios - UIView(AdditionalLayoutSupport) _switchToLayoutEngine Xcode 崩溃

objective-c - Apple Mach-O 链接器错误 lxml

javascript - 为什么在 IE 浏览器中右键单击会停止 javascript

ios - 事件指示器不会以相同的方法停止

ios - 在 uiwebview 上添加事件指示器