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

【字号: 日期:2024-04-14浏览:26作者:雯心
(adsbygoogle = window.adsbygoogle || []).push({}); 如何解决Swift3 GCD中的main.async vs main.sync()vs global()async?

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

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

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

这意味着使用后台线程在Global Queue中执行任务,并且当任务完成时,而不是 使用将工作从 ,然后更新到UI。

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

解决方法

示例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是否有任何区别。

相关文章: