菜鸟教程小白 发表于 2022-12-13 02:34:02

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


                                            <p><p>在后台进行一些冗长的操作时,我们都会显示事件指示器。虽然事件指示器显示一个不断旋转的轮子,但它不会给主线程带来负担,因为同一屏幕中的其他 <code>UIComponents</code> 仍然会对触摸使用react。</p>

<p><strong>我认为我知道的:</strong></p>

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

<p><strong>学习:</strong></p>

<p>我查看了第三方事件指标的代码。他们中的大多数使用 <code>CABasicAnimation</code> 并总是在动画上调用重复。虽然很少有工作直接使用 NSTimer 重复调用 <code>drawrect</code>,但延迟很小。他们的代码之所以有效,是因为调用 <code>drawrect</code> 有一个小的延迟,并且方法 <code>drawrect</code> 本身是轻量级的。 </p>

<p>它们都不会减轻主线程的负载,而是它们会小心地将负载放在主线程上,足以让动画继续进行,同时让主线程可以自由处理触摸事件</p>

<p><strong>我想知道的:</strong></p>

<p>1 - 这种实现事件指标的策略是否正确?或这样的声明</p>

<pre><code>self.timer =[NSTimer timerWithTimeInterval:0.1 target:self
selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES];
      [ addTimer:self.timer forMode:NSRunLoopCommonModes];
</code></pre>

<p>在我看到的其中一个第三方事件指示器中有什么特殊效果?</p>

<p>2 - 如果我运行 CABasicAnimation/transaction 并永远重复动画,与手动重复调用 setNeedsDispaly/drawrect 相比,它会对主线程的负载有什么特殊影响吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我不确定它是否有助于实现您自己的事件指示器,但系统一个 <code>UIActivitiyIndi​​catorView</code> 只是一个 <code>UIImageView</code> 与替换的 12 个图像的数组随着时间的推移彼此。 </p>

<p> <a href="/image/rsZha.png" rel="noreferrer noopener nofollow"><img src="/image/rsZha.png" alt="UIActivityIndicatorView"/></a> </p>

<p>Apple 通过使他们的微调器离散化做了一个非常巧妙的把戏。它允许他们有一个简单的实现,不会在 CPU 上产生任何计算负载。</p>

<p><strong>UPD</strong></p>

<p>回到你想知道的事情:
<em>1</em> - 不是,因为在 <code>drawRect</code> 中实现手动绘制框架完全由 CPU 完成。 <em>2</em> - 我不能肯定地说,但如果有人相信 Apple 在文档和视频中关于 <code>Core Animation</code> 的说法,那么它会经过大量优化并在 <code>Metal 上运行</code> 或至少在下面的 <code>OpenGL</code>,因此可以利用 GPU 的强大功能。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 为什么不断动画 UIActivityIndi​​cator 不会阻塞主线程?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/46069038/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/46069038/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 为什么不断动画 UIActivityIndi​​cator 不会阻塞主线程?