Ama*_*ani 78 concurrency multithreading ios swift swift3
我一直在使用DispatchQueue.main.async很长一段时间来执行一些与UI相关的操作.但Swift提供了DispatchQueue.main.async和DispatchQueue.main.sync,两者都在主队列中执行.那么有谁可以告诉我他们之间的区别?我什么时候应该使用它们?先感谢您.
DispatchQueue.main.async {
self.imageView.image = imageView
self.lbltitle.text = ""
}
DispatchQueue.main.sync {
self.imageView.image = imageView
self.lbltitle.text = ""
}
Run Code Online (Sandbox Code Playgroud)
Ale*_*der 133
为什么要并发? 只要您向应用程序添加繁重的任务(如数据加载),就会降低UI工作速度,甚至冻结它.并发允许您"同时"执行2个或更多任务.这种方法的缺点是螺纹安全性并不总是那么容易控制.当不同的任务想要访问相同的资源时,例如尝试在不同的线程上更改相同的变量或访问已被不同线程阻止的资源.
我们需要注意一些抽象概念.
队列.
必须是串行或并发的.以及全球或私人同时.
使用串行队列,任务将逐个完成,而并发队列,任务将同时执行,并将在意外的时间表上完成.与并发队列相比,同一组任务将占用串行队列的更多时间.
您可以创建自己的专用队列(串行或并发)或使用已有的全局(系统)队列.该主队列是唯一的串行队列出所有的全局队列.
强烈建议不要执行在主队列上没有引用UI工作的繁重任务(从网络加载数据),而是在其他队列上执行这些任务以保持UI解冻并响应用户操作.如果我们在其他队列上更改UI,则可以根据不同的意外计划和速度进行更改.可以在需要之前或之后绘制一些UI元素.它可能会导致UI崩溃.我们还需要记住,由于全局队列是系统队列,因此系统可以在其上运行一些其他任务.
服务质量/优先权.
队列也有不同的qos(服务质量),它设置任务执行优先级(从最高到最低)
:.userInteractive - 主队列
.userInitiated - 用户启动的任务,用户等待某些响应
.utility - 任务这需要一些时间并且不需要立即响应,例如使用数据
.background - 用于与可视部分无关且对完成时间不严格的任务.
还有
.default队列,它不传输qos信息.如果无法检测到qos,则将在.userInitiated和.utility之间使用qos.
任务可以同步或异步执行.
同步函数仅在任务完成后才将控制权返回给当前队列.它会阻塞队列并等待任务完成.
异步函数在任务发送到不同队列后立即将控制权返回给当前队列.它不会等到任务完成.它不会阻止队列.
常见的麻烦.
在预测并发应用程序时,程序员最常犯的错误如下:
切勿在主队列上调用同步功能.
如果你在主队列上调用sync函数,它将阻塞队列,并且队列将等待任务完成但是任务永远不会完成,因为它甚至无法启动,因为队列是已被封锁.它被称为死锁.
何时使用同步?
当我们需要等到任务完成时.我们确保某些函数/方法不是双重调用时的Fe.我们有同步并试图阻止它被双重调用,直到它完全结束.以下是此问题的一些代码:
如何找出导致IOS设备错误崩溃报告的原因?
And*_*kha 23
当您使用async它时,让调用队列继续运行而不等待执行调度块.相反,sync将使调用队列停止并等待您在块中调度的工作完成.因此sync会导致死锁.尝试DispatchQueue.main.sync从主队列运行,应用程序将冻结,因为调用队列将等待调度块结束,但它甚至无法启动(因为队列已停止并等待)
什么时候用sync?当您需要等待在不同队列上完成的任务时,然后才继续处理当前队列
使用同步的示例:
在串行队列上,您可以将其sync用作互斥锁,以确保只有一个线程能够同时执行受保护的代码段.
| 归档时间: |
|
| 查看次数: |
54074 次 |
| 最近记录: |