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

2023-11-21

我一直在使用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(使用前将#替换为@)

DispatchQueue.main.async 和 DispatchQueue.main.sync 之间的区别 的相关文章

  • 在phonegap中播放本地声音

    我有一个 wav文件在我的www文件夹 我正在使用 jQuery 和以下代码 警报响起 但声音不播放 难道我做错了什么
  • ConcurrentBag 中可能存在内存泄漏吗?

    我一直在研究新的并发集合 特别是 ConcurrentBag 引起了我的注意 由于 ConcurrentBag 在每个单独的线程上内部保存一个本地集 使用它来跟踪项目 这意味着当线程本身超出范围时 ConcurrentBag 仍将在内存中引
  • 在 iOS 上构建 WebRtc

    我按照以下说明成功地在 MAC 上构建了 WebRTC http www webrtc org reference getting started http www webrtc org reference getting started
  • iOS9 Sprite 套件问题

    一切都很顺利 直到我升级到 xCode 7 和 iOS 9 我当前的项目是一个 2D 平台游戏 自从升级以来 我就陷入了我们许多人似乎都面临的精灵套件错误 错误的困扰 我的问题是 每次游戏在模拟器或设备上运行时 所有精灵的 zPositio
  • iOS8 自签名证书已安装但仍不受信任

    由于我无法控制的原因 我需要使用自签名证书针对平台进行 iOS 开发 它是一个在 SAN 中具有特定 IP 地址的根证书 当证书安装在 OSX 系统帐户下时 所有浏览器现在将正常信任对给定 IP 地址的任何访问 通过电子邮件将同一证书发送到
  • 如何在javascript中计算日出和日落?

    我正在使用appcelerator titan开发一个IOS应用程序 我想让我的应用程序在日出和日落时向用户发送本地通知 解决这个问题的一个好工具是使用 YQL 的雅虎天气 但是 雅虎天气仅供非商业用途 我正在尝试找到一个javascrip
  • 强制本地化图像或图像资产

    正如在这个问题中 如何强制 NSLocalizedString 使用特定语言 https stackoverflow com questions 1669645 how to force nslocalizedstring to use a
  • UICollectionViewFlowLayout 使其布局无效后重绘单元格

    当您使布局无效时UICollectionViewFlowLayout它为每个单元格创建了一堆新的布局属性 然而 它不会告诉您的单元格重新绘制 这会导致任何图层绘图变形 我不想告诉我的集合重新加载其数据 因为这会删除流属性之间的任何良好转换
  • 使用 HTTP NSURL 创建 AVAsset

    我正在尝试合并两个NSURLs包含视频参考 其中一个 URL 指向 AWS 上的视频 另一个 URL 指向本地存储的视频 我的导出代码有效 因为我已经尝试使用两个本地视频 但每当我尝试合并 HTTP url 和本地 url 时 我都会收到此
  • 如何可靠地判断 boost 线程是否已退出其 run 方法?

    我以为 joinable 会表明这一点 但事实似乎并非如此 在工人阶级中 我试图表明它仍在通过谓词进行处理 bool isRunning return thread gt joinable 已经退出的线程不是不能加入吗 我错过了什么 boo
  • iOS9 Swift 文件使用 NSURL 创建 NSFileManager.createDirectoryAtPath

    在iOS9之前 我们创建了一个像这样的目录 let documentsPath NSSearchPathForDirectoriesInDomains DocumentDirectory UserDomainMask true 0 as S
  • 如何在 Swift 中使用函数数组

    我已经阅读了我可以在这里找到的所有关于函数数组的帖子 太棒了 你能做到 我估计 但没有一篇文章实际上展示了如何使用它们 至少不是我想要做的 这就是我想要的 它们都可以采用相同的参数 但这不是必需的 这篇文章很接近 将允许我循环执行每个函数
  • 在 XCode 中本地化 HTML 文件

    我有一个本地化的 iOS 应用程序 我希望在其中包含一些本地化的 HTML 文件 我不知道该怎么做 目前 我的文件夹结构如下所示 myapp en lrproj Localizable strings fr lrproj Localizab
  • Xcode 7.2 无法连接到装有 iOS 9.2 的 iPhone

    出于开发目的 我已经在我的 iPhone 5s 上安装了 iOS 9 2 beta 当然 我还安装了Xcode 7 2 beta 当我想在设备上运行应用程序扩展 键盘 时 该应用程序会正确构建 安装在 iPhone 上并启动 然而 然后我在
  • 如何在 GHCJS 程序中定期执行操作?

    应该有人使用setInterval通过Javascript 或者使用一些更惯用的基于线程的解决方案 Using setInterval posed 一些挑战 https stackoverflow com questions 3357661
  • 如何在复杂的层次结构中上下同步 CALayer 和 UIView 动画

    See 如何在整个层次结构中管理 CALayer 动画 https stackoverflow com questions 26917908 how to manage calayer animations throughout a hie
  • 当另一个线程发生事情时从主线程获取数据?

    目前我有一个线程正在运行一个侦听连接的套接字 当它收到连接时 它需要上传在主线程中收集的数据 即从主线程获取数据 但是 我传递了对象的实例 但它从未使用等待连接时收集的数据进行更新 有没有正确的方法来做到这一点 我用谷歌搜索了一下 似乎找不
  • iOS 上的推送通知渐进式 Web 应用程序

    我需要开发一个集成了推送通知的渐进式网络应用程序 在网上搜索我发现了关于这个主题的不同意见 如果我理解正确的话 目前我们无法在移动版 safari 中推送通知 但仅限桌面版 这样对吗 你有什么建议来获得相同的结果吗 我不是iOS专家 我想知
  • SwiftUI 自动调整底部工作表的大小

    SwiftUI 有很多底部工作表的示例 但是它们都指定了使用 GeometryReader 工作表可以增长到的某种类型的最大高度 我想要的是创建一个底部工作表 其高度仅与其中的内容一样高 我使用首选项键提出了下面的解决方案 但必须有更好的解
  • 如何从 App Store Connect 中删除自动创建的 macOS 应用程序

    I have an iOS app Recently macOS app automatically appeared in App Store Connect 我不打算在 macOS 上发布 iOS 应用程序 我怎样才能摆脱它 我打开了

随机推荐