gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:50:09 24 4
gpt4 key购买 nike

示例 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com