ios - Swift3 GCD 中的 main.async vs main.sync() vs global().async

标签 ios swift multithreading asynchronous swift3

示例 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 时,为什么我的应用程序崩溃了。

Quest2:- main.async 和 global().async 有什么区别吗?

最佳答案

简单来说,我得出的结论是——

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

DispatchQueue.main.async

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

DispatchQueue.global().async 和 global().sync

这意味着使用后台线程在全局队列中执行任务,当任务完成时,global().sync 使用将工作从 globalQueue 带到 mainQueue 更新到用户界面。

我的应用崩溃的原因

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

关于ios - Swift3 GCD 中的 main.async vs main.sync() vs global().async,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46732016/

相关文章:

multithreading - 如何修复 Java 绑定(bind) : UnsatisfiedLinkError?

Swift : [Warning: Unable to create restoration in progress marker file] during first launch 中的 iOS 8 和 9

ios - 具有存储字符串日期的 Firebase 云消息传递

ios - UIButton 无法针对 iPhone 4/5 屏幕尺寸正确调整文本大小。 (使用内在内容大小)

ios - UItableView 中的 UICollectionView 只获取空的 tableview,我错过了什么?

c# - 如何从后台工作线程更改 XAML 元素?

ios - UNNotificationRequest 每天在特定时间发送本地通知

iphone - 其他用户之间的 iCloud 共享

ios - Xcode 4.5 安装在我的 Mac 上的什么位置?

c - 线程参数传递c