ios – DispatchQueue.main.async和DispatchQueue.main.sync之间的区别

参见英文答案 > Grand Central Dispatch async vs sync                                    4个
我一直在使用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 = ""

        }
为什么要并发?
一旦你添加到你的应用程序繁重的任务,如数据加载,它会减慢你的UI工作,甚至冻结它.
并发允许您“同时”执行2个或更多任务.
这种方法的缺点是螺纹安全性并不总是那么容易控制. F.E.当不同的任务想要访问相同的资源时,例如尝试在不同的线程上更改相同的变量或访问已被不同线程阻止的资源.

我们需要注意一些抽象概念.

>队列.
>同步/异步任务性能.
>优先事项.
>常见的麻烦.

队列.

必须是串行或并发的.以及全球或私人同时.

在串行队列上,任务将逐一完成,而并发队列任务将同时执行,并将以意外的时间表完成.与并发队列相比,同一组任务将占用串行队列更长的时间.

您可以创建自己的专用队列(串行或并发)或使用已有的全局(系统)队列.
只有主队列是全局队列中的串行队列.

强烈建议不要执行主要队列上的UI工作(例如,从网络加载数据)中未提及的繁重任务,而是执行其他队列以保持UI解冻并响应用户操作.如果我们在其他队列上更改UI,则可以使用不同的意外计划和速度进行更改,以便可以在需要之前或在为时已晚时绘制一些UI元素.它可能会崩溃UI.还需要记住,由于全局队列是系统队列,因此系统可以在其上运行一些其他任务.

服务质量/优先权.

队列也有不同的qos(服务质量),它设置任务执行优先级(从最高到最低):
.userInteractive – 主队列.userInitiated – 用户启动的任务,用户等待某些响应.utility – 用于需要一些时间且不需要立即响应的任务,例如使用数据.background – 用于任务与视觉部分相关,并且对完成时间不严格.还有.default队列,它不传输qos信息.
如果无法检测到qos,则将在.userInitiated和.utility之间使用qos.

任务可以同步或异步执行.

>同步函数仅在任务完成后才返回当前队列中的控件.它会阻塞队列并等待任务完成.
>异步函数在任务发送到不同队列后立即返回对当前队列的控制.它不会等到任务完成.它不会阻止队列.

常见的麻烦.

程序员在预测并发应用程序时所犯的最常见错误如下:

>竞争条件 – 当应用程序工作时,取决于代码部分执行的顺序.
>优先级倒置 – 当较小优先级任务的较高优先级任务等待由于某些资源被阻止而完成时
>死锁 – 当少数队列无限等待已被某些队列阻塞的源(变量,数据等)时.

切勿在主队列上调用同步功能.
如果你在主队列上调用sync函数,它将阻塞队列,并且队列将等待任务完成但是任务永远不会完成,因为它甚至无法启动,因为队列是已被封锁.它被称为死锁.

何时使用同步?
当我们需要等到任务完成时. F.E.当我们确保某些函数/方法不是双重调用时. F.E.我们有同步并试图阻止它被双重调用,直到它完全结束.这里有一些关于这个问题的代码:How to find out what caused error crash report on IOS device?

相关文章
相关标签/搜索