很长一段时间以来,我一直使用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 = ""
}

推荐答案

当您使用async时,它让呼叫队列继续前进,而无需等到调度的挡路执行完.相反,sync会使呼叫队列停止,并等待您在挡路中调度的工作完成.因此,sync容易导致死锁.try 从主队列运行DispatchQueue.main.sync后,应用程序将冻结,因为调用队列将等待到调度的挡路结束,但它甚至无法启动(因为队列已停止并在等待)

什么时候用sync?当您需要等待在不同队列上完成某项操作,然后才继续在当前队列上工作时

使用同步的示例:

在串行队列中,可以使用sync作为互斥,以确保只有一个线程能够同时执行受保护的代码段.

Ios相关问答推荐

在iOS中禁用URLSession自动重试机制

在工作表上移动图像SwiftUI

XcodeCloud生成失败,返回";ci_pre_xcodeBuild.sh是可执行文件,但退出时返回2个退出代码.";

无法使用 NavigationView 和 NavigationLink 在 SwiftUI 中弹出当前屏幕

SwiftUI中的Tap手势无法识别视图上的偏移变化

Flutter动画放大图

CGPath intersection(_:using:) 和朋友(iOS 16 中的新功能)坏了?

如何在 Mac OS Ventura 中使用 Xcode 13

使用 SceneKit 从 CapturedRoom.walls 重新创建 RoomPlan

如何在 SwiftUI 的 TabView 中添加底部曲线?

通过 tuist/XcodeProj 以编程方式将文件添加到本机目标

滑动以返回特定的 SwiftUI 视图

将flutter android项目导入iOS

使用 Vim 代替(或与)Xcode 进行 iOS 开发

如何判断 `NSManagedObject` 是否已被删除?

Got Unrecognized selector -replacementObjectForKeyedArchiver: 在 Swift 中实现 NSCoding 时崩溃

以编程方式获取故事板 ID?

在 Swift 中禁用向后滑动手势

如何在react 导航中获取当前路由名称?

如何使用 UISegmentedControl 切换视图?