1
6
这是一个影响大多数操作系统的旧限制:与UI相关的操作,例如更改UI中的元素,必须只能从特定线程调用,通常是所谓的 主要的 线 在许多情况下,这不是问题,因为用户界面相关的代码通常在某些用户界面事件(用户单击或点击、按键等)触发时起作用。这些事件回调发生在主线程上。因此没有线程问题。
使用GCD,您可以在不同的线程上运行长时间运行的任务,这样任务就不会减慢甚至阻塞UI。因此,当这些任务完成后,您想要更新UI(例如,显示结果),您必须在主线程上这样做。具有
如果在任务结束时,UI中没有任何可显示或更新的内容,则无需调用
更新Firebase Firebase数据库客户端在单独的后台线程中执行所有网络和磁盘操作 关 主线。 Firebase数据库客户端调用对代码的所有回调 在…上 主线。
所以不需要打电话
|
2
2
仅供参考,所有UI代码都需要在主线程上运行的原因是,绘图是一个(相对CPU时间而言)漫长而昂贵的过程,涉及许多数据结构和数百万像素。图形代码在执行帧更新时基本上需要锁定所有UI资源的副本,因此您不能在绘制过程中编辑这些资源,否则,如果在系统渲染这些对象的过程中进行了一半的更改,就会出现wierd瑕疵。由于所有绘图代码都在主线程上,因此系统可以阻止主线程,直到渲染完成,因此在当前帧完成之前,不会处理任何更改。此外,由于一些图形是缓存的(基本上渲染为纹理,直到您调用setNeedsDisplay或setNeedsLayout之类的东西),如果您尝试从后台线程更新某些内容,则完全有可能它不会显示并导致不一致的状态,这就是为什么您不应该在后台线程上调用任何UI代码。 |
Max Kraev · Swift中的嵌套异步调用 6 年前 |
onTheWay · 为什么并发队列的行为很奇怪? 6 年前 |
ChokWah · iOS中的GCD始终创建新线程 6 年前 |
Mike · 如何调度。主要的异步“更新UI”? 7 年前 |
Paul T. · 不同请求的不同DispatchQueue 7 年前 |