Swift3 GCD 中的 main.async 与 main.sync() 与 global().async

2024-03-22

示例 A:这会导致应用程序崩溃。

DispatchQueue.main.async {           
    let url = URL(string: imageUrl)
    do {
         let data = try Data(contentsOf: url!)
            DispatchQueue.main.sync {
                self.imageIcon.image = UIImage(data: data)
            }
        }

示例 B:但这并不

DispatchQueue.global().async {  
    let url = URL(string: imageUrl)
    do {
        let data = try Data(contentsOf: url!)
            DispatchQueue.main.sync {
                self.imageIcon.image = UIImage(data: data)
            }
        }

据我所知:

  • x.sync 意味着在主线程/UI 线程中执行操作。
  • x.async 意味着在后台线程中执行。
  • 全局意味着使用并发队列执行某些操作,即并行任务。

问题 1:当我在后台线程(即 main.async)上执行任务而不是调用主线程来更新 UI 时,为什么我的应用程序会崩溃?

问题2:有什么区别吗?main.async & global().async?


简而言之,我得出的结论是——

  • Queue- 有 3 种类型的队列,即 1 个主队列、4 个全局队列和任意数量的自定义队列。
  • Threads- 一个是系统的主线程和其他后台线程 提供给我们。

DispatchQueue.main.async

-这意味着使用后台线程在主队列中执行任务(不阻塞 UI),并且当任务完成时,它会自动更新到 UI,因为它已经在主队列中。

DispatchQueue.global().async 与 global().sync

这意味着使用后台线程在全局队列中执行任务,当任务完成时,比全局().sync使用来自的工作全局队列到主队列更新到 UI。

我的应用程序崩溃的原因

我试图通过使用(main.sync)将完成的任务带到MainQueue,但它已经在MainQueue上,因为我没有切换队列,并且这个创建死锁(MainQueue 等待自身),导致我的应用程序崩溃

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift3 GCD 中的 main.async 与 main.sync() 与 global().async 的相关文章

  • Java Executor 根据 CPU 和 RAM 使用情况调整线程池

    我的应用程序使用 Executor 为大量任务提供线程池 通过分析和基准测试 我确定当每个核心有多个线程时 我的应用程序运行速度最快 一个好的启发式方法是从每个核心 4 个线程开始 不断变化 直到达到 gt 90 CPU 或 gt 90 R
  • XcodeColors 在 XCode 5 中不起作用

    我尝试安装XcodeColors在 XCode 5 中 但不幸的是 它不能与我从 XCode 4 6 获得的旧插件一起使用 下一步 我检查了 github 网站 在那里我看到了以下拉取请求 提供了 XCode 5 的工作版本 https g
  • Swift:如何审查/过滤输入的脏话等文本?

    我只是想看看是否有一种既定的方法可以做到这一点 或者如何去做 我有一个文本字段 它本质上充当我的 iOs 应用程序中的表单 用户可以在其中发布内容 我不能让用户发布脏话 不恰当的废话 所以我想过滤掉他们输入的字符串包含这些单词之一的内容并显
  • 多次显示admob插页式广告怎么办?

    我有一个小型游戏应用程序 它有一个故事板 里面创建了像开始菜单 游戏区域 分数这样的场景 我在其中添加了 admob 横幅视图和插页式广告 我的横幅视图工作正常 但我的插页式广告只能工作一次 我在 viewdidload 上加载插页式广告
  • IBDesignable 和 UITableViewCell

    我正在尝试利用 XCode 6 中 Swift 的 IBDesignable 功能来创建 UITableViewCell 的子类 我在 WWDC 演示和网络上看到 您可以使用框架来创建视图 UIView 的子类 然后可以将其用于自定义 UI
  • NSMenuItem with attributeTitle 包含 NSFont 对象,绘制带有基线偏移的标题

    我正在尝试使用系统中可用的字体列表创建一个 NSPopUpButton 看起来很明显的任务 但我失败了 我想 我错过了一些如此明显的事情 以至于我完全忘记了它 代码非常简单 let button NSPopUpButton button m
  • 代码编译期间遇到警告消息“使用或覆盖已弃用的 API”

    我编译了我的程序并收到以下错误 我该如何解决呢 Note ClientThreadClients java uses or overrides a deprecated API Note Recompile with Xlint depre
  • 为什么一个线程会中断另一个线程[重复]

    这个问题在这里已经有答案了 在Java多线程应用程序中 我们处理InterruptedThreadException 如果另一个线程中断当前线程 则会抛出此异常 现在 当另一个线程知道它将导致异常时 它可能想要中断当前线程的原因是什么 很多
  • 在 iPhone 5 的横向模式下启动启动画面

    我们的通用应用程序仅适用于横向模式 我们需要为 iPhone 4 和 iPhone 5 添加启动画面 对于 iPhone 5 的肖像 我们使用 email protected cdn cgi l email protection 如何为 i
  • PreferredInterfaceOrientationForPresentation 必须返回受支持的界面方向 (iOS 6)

    我的应用程序窗口的根视图控制器是 UINavigationController 的子类 我已将此代码添加到类中 BOOL shouldAutorotate return self topViewController shouldAutoro
  • 如何使用自定义布局跳转到 UICollectionView 中的任何 Cell?

    我的水平 UICollectionView 中有 40 个单元格和一个按钮 当我点击按钮时 我可以从 5 号单元格跳转到 10 号单元格 但是一旦我想要转到另一个单元格 例如从 5 到 25 它不起作用 而是变为 0 code func s
  • 推送通知需要很长时间才能到达

    我在适用于 iOS 和 Android 的 Adob e Air 应用程序中遇到推送通知的奇怪问题 我正在使用 Milkman Games 的 Easy Push ANE 以及 One Signal 服务 问题是通知确实会到达 但有时 随机
  • 迁移大型 Core Data 数据库崩溃

    我有一个将产品存储在核心数据文件中的应用程序 这些产品包括作为 可转换 数据的图像 现在我尝试使用轻量级迁移添加一些属性 当我使用一个小型数据库对其进行测试时 它运行良好 但当我使用一个接近 500 MB 的大型数据库时 应用程序通常会因内
  • 如何在WKInterfaceLabel下面放置一个WKInterfaceLabel?

    大家好 我在 watchkit 开发中有新的东西 我有特殊要求 我将一个 WKInterfaceLabel 安排在另一个 WKInterfaceLabel 下面 我尝试使用很多关闭选项 例如编辑位置 但 WKInterfaceLabel 未
  • MPMoviePlayerController 播放 YouTube 视频

    如何在 iPhone 上的 MPMoviePlayerController 中播放 YouTube 视频 同时避免进入全屏模式 这个问题已经在这里提出 MPMoviePlayerController 正在播放 YouTube 视频吗 htt
  • Nodejs 异步 Promise 队列

    我需要使用速率受限的 API 例如 我一秒钟只能进行 10 个 API 调用 因此我需要等待当前秒结束才能进行另一个 API 调用 为了实现这一目标 我想创建一个可以自行管理的异步队列 它的主要功能是让我向队列添加一个新的 Promise
  • GIDSignIn 在提示前指定范围

    我在 iOS 上升级到 GoogleSignIn 6 0 但找不到在登录时指定登录范围的方法 我只能看到一个名为 addScopes 的 API 我可以在基本登录后指定范围 但这会导致两个单独的登录提示 这很奇怪 之前 我们可以简单地指定登
  • NSRange 到 Range

    我怎样才能转换NSRange to Range
  • 如何获取 ios 日期数组中的所有星期日

    我只想要一个数组 它以 NSDate 的形式包含一年中的所有星期一 但速度很快 我在 Objective c 中使用以下代码 但不知道如何在 swift 中使用它 NSDate pickerDate NSDate date NSLog pi
  • 在 swift 中从本地视频创建缩略图

    如何从本地视频文件快速创建缩略图 例如 如果视频文件路径位于此处 file Users Dev Library Developer CoreSimulator Devices F33222DF D8F0 448B A127 C5B03C64

随机推荐

  • 金字塔资源:简单的英语

    我一直在阅读对新创建的金字塔应用程序实施授权 和身份验证 的方法 我不断遇到 资源 这个概念 我在应用程序中使用 python couchdb 根本不使用 RDBMS 因此没有 SQLAlchemy 如果我像这样创建一个 Product 对
  • 为什么说malloc()和printf()是不可重入的?

    在 UNIX 系统中我们知道malloc 是不可重入函数 系统调用 这是为什么 相似地 printf 也被认为是不可重入的 为什么 我知道可重入的定义 但我想知道为什么它适用于这些函数 是什么阻止了它们保证可重入 malloc and pr
  • Cassandra 种子节点和连接到节点的客户端

    我对 Cassandra 种子节点以及客户端如何连接到集群有点困惑 我似乎在文档中找不到这一点信息 客户端是否仅包含种子节点列表 并且每个节点委托一个新主机供客户端连接 种子节点是否真的仅用于节点到节点的发现 而不是客户端的特殊节点 每个客
  • 如何捕获发送到模拟的参数?

    有谁知道如何捕获发送到 OCMock 对象的参数 id mock OCMockObject mockForClass someClass NSObject captureThisArgument mock expect foo
  • 如何从 onBind 函数获取尝试绑定我的服务的应用程序包名称或 UID?

    我在一个应用程序中有一个服务 我可以从不同的应用程序访问该服务 当应用程序尝试绑定此服务时 我想知道哪个应用程序正在尝试在 onBind 函数中绑定我的服务 但我无法在 onBind 函数中获取该应用程序的包名称或 UID 是否可以获取尝试
  • 使用 MPJ Express 发送对象

    我是并行编程的新手 我想用 java 来完成它 我想知道是否可以通过 MPI 发送和接收更复杂的对象 我用的是 MPJ Express 然而 每当我想发送一个对象时 我都会收到 ClassCastException MPI Init arg
  • 如何使用 vscode:// 链接打开文件

    我想像phpstorm一样使用vscode ide链接 我知道我们可以phpstorm open file filepath line line 如何使用vscode达到同样的效果 多谢 这个链接 vscode file file line
  • SwiftUI 在 NavigationLink 视图中隐藏 TabView 栏

    我为每个选项卡项目都有一个 TabView 和单独的 NavigationView 堆栈 它工作得很好 但是当我打开任何 NavigationLink 时 TabView 栏仍然显示 我希望每当我单击任何导航链接时它就会消失 struct
  • 使用 iPhone 将图片发布到 Twitter

    我对在 ios4 上使用 Twitter API 完全陌生 我正在寻找将 uiimage 发布到用户页面的最简单方法 如何 use http dev twitpic com http dev twitpic com 在此处发布您的 http
  • jQuery 中元素的总宽度(包括内边距和边框)

    正如主题所示 如何使用 jQuery 获取元素的总宽度 包括其边框和填充 我已经有了 jQuery 尺寸插件 并且正在运行 width on my 760px wide 10px paddingDIV 回报760 也许我做错了什么 但如果我
  • 有什么方法可以初始化 unique_ptr 向量吗?

    例如 struct A vector
  • React - 作为 npm 包发布的组件之间的通信和路由

    我正在尝试为该项目设置微前端架构 该项目包含多个react应用 以下是项目结构 容器 标头 npm 包 仪表板 npm 包 app1 npm 包 app2 npm 包 app3 npm 包 在这里 容器充当其他应用程序的包装器 仪表板应用程
  • 带 where 子句的 T-SQL Group by

    Masterid CC CLA DES NLCLA NLDES 53006141 CN 0 0 1 1 53006141 US 1 1 1 1 53006141 UK 1 1 0 0 53006142 US 1 1 0 0 53006142
  • 在危险的SetInnerHTML中传递反应组件

    服务器返回类似以下内容 内容 p Hello world smile strong NICE strong p 这是因为我们支持降价 现在我有一个解析器可以解析所有内容 text 变成表情符号 我在用emoji mart对于这个 这就是内容
  • 自动从外部文件替换表

    我正在尝试使用外部 XML 文件替换大型 300 MB XML 文件中的多个表 大约有 30 000 个表 并且有 23 000 个 XML 文件 因为某些表未更改 例如 如果我有
  • Scrapy:为什么提取的字符串是这种格式?

    我正在做 item desc site select a text extract 但这会像这样打印 u n A mano libera n 我必须做什么来添加和删除奇怪的字符 例如 u in 尾随空格和 我无法修剪 剥离 exceptio
  • jQuery mobile - 将页面拆分为不同的文件

    我正在开发一个基于 jQuery 和 jQuery mobile 的网络应用程序 我想显示不同的页面 但由于相应的 html 标记可能会变得很大 我想将 html 分成不同的文件 即 div div
  • 从另一个控制器调用 WebApi 控制器

    所以我的解决方案中有两个项目 两者都是WebApi 我在两者中都有控制器 我可以从客户端调用它们 javascript 问题是我需要从第一个项目的控制器中的方法调用第二个项目的控制器中的方法 我还认为我应该声明我需要调用的方法是 Post
  • 来自 learnsauce.com 的 google+ 集成代码引发了很多错误并且构建失败

    我尝试了很多网站进行 google 登录集成 但即使是 Developers android 代码也有很多错误 于是我看了一个学酱的视频 这是 Learn Sauce 的 G 集成视频教程的链接 https www youtube com
  • Swift3 GCD 中的 main.async 与 main.sync() 与 global().async

    示例 A 这会导致应用程序崩溃 DispatchQueue main async let url URL string imageUrl do let data try Data contentsOf url DispatchQueue m