我一直在使用DispatchQueue.main.async
长时间执行UI相关操作。
Swift 两者都提供DispatchQueue.main.async
and DispatchQueue.main.sync
,并且两者都在主队列上执行。
谁能告诉我它们之间的区别?我应该什么时候使用它们?
DispatchQueue.main.async {
self.imageView.image = imageView
self.lbltitle.text = ""
}
DispatchQueue.main.sync {
self.imageView.image = imageView
self.lbltitle.text = ""
}
为什么要并发?
一旦您向应用程序添加繁重的任务(例如数据加载),它就会减慢您的 UI 工作速度,甚至冻结它。
并发允许您“同时”执行 2 个或更多任务。
这种方法的缺点是线程安全性并不总是那么容易控制。 F.e.当不同的任务想要访问相同的资源时,例如尝试更改不同线程上的相同变量或访问已被不同线程阻塞的资源。
我们需要注意一些抽象概念。
- Queues.
- 同步/异步任务性能。
- 优先事项。
- 常见的烦恼。
Queues
Must be serial or 同时。也global or private同时。
使用串行队列,任务将被一项一项完成,而使用并发队列,任务将同时执行,并按意想不到的时间表完成。与并发队列相比,同一组任务在串行队列上将花费更多时间。
您可以创建自己的私人队列 (both serial or 同时)或使用已有的全局(系统)队列.
The 主队列是唯一的串行队列出所有的全局队列.
强烈建议不要执行与 UI 工作无关的繁重任务主队列(例如,从网络加载数据),而是在其他队列上执行这些操作,以保持 UI 不冻结并响应用户操作。如果我们让 UI 在其他队列上进行更改,则可以以不同的且意想不到的时间表和速度进行更改。某些 UI 元素可以在需要之前或之后绘制。它可能会使 UI 崩溃。我们还需要记住,自从全局队列 are 系统队列还有一些其他任务可以由系统在它们上运行。
服务质量/优先级
队列也有不同qos(服务质量)这设置了任务执行priority(这里从最高到最低):
.userInteractive- 至于主队列
.userInitiated- 对于用户启动的任务,用户等待某些响应
.utility- 对于需要一些时间且不需要立即响应的任务,例如处理数据
。背景- 对于与视觉部分无关且对完成时间不严格的任务)。
还有
.default不传输的队列qos信息。
如果无法检测到qos the qos将在之间使用.userInitiated and .utility.
可以执行任务同步地 or 异步地.
常见问题。
程序员在设计并发应用程序时最常犯的错误如下:
-
比赛条件- 当应用程序工作取决于代码部分执行的顺序时引起。
-
优先级反转- 当较高优先级任务由于某些资源被阻塞而等待较小优先级任务完成时
-
Deadlock- 当一些队列无限等待已被其中一些队列阻塞的源(变量、数据等)时。
永远不要在主队列上调用同步函数.
如果您在主队列上调用同步函数,它将阻塞队列,并且队列将等待任务完成,但任务将永远不会完成,因为它甚至无法启动,因为队列是已经被封锁了。它被称为deadlock.
什么时候使用同步?当我们需要等待任务完成时。 F.e.当我们确保某些函数/方法没有被重复调用时。 F.e.我们有同步并试图防止它被重复调用,直到它完全完成。以下是解决此问题的一些代码:
如何找出导致 IOS 设备上错误崩溃报告的原因?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)