当前位置: 首页 > 面试题库 >

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

后焕
2023-03-14
问题内容

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


问题答案:

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

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

DispatchQueue.main.async

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

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

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

我的应用崩溃的原因

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



 类似资料:
  • 有人能更多地说明这个话题吗?具体地说,我正在寻找一个示例,说明服务器的servlet3.0实现如何可以是异步的,但在线程上阻塞?我想,如果我理解了这一点,就更容易理解Servlet3.1中的非阻塞I/O试图解决的确切问题。

  • 问题内容: 我有一个循环 该有回调到另一个功能。 如我所见,它们不会同步执行。在函数中的回调完成之前,循环将继续执行其他项。 如何让循环等到迭代完成(包括回调)? 问题答案: 假设接受回调,我们可以使用它来实现。

  • 我使用子JPanel构造JScrollPane,然后尝试将JScrollPane添加到父JPanel中,希望有一个可滚动的自定义JPanel。 我有一个大的细白线前面的所有我的组件,他们是没有滚动。有什么想法吗?

  • 本文向大家介绍简介Android 中的AsyncTask,包括了简介Android 中的AsyncTask的使用技巧和注意事项,需要的朋友参考一下 AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合。其实AsyncTask并不是那么好,甚至有些糟糕。本文我会讲AsyncTask会引起哪些问题,如何修复这些问题,并且关于AsyncTask的一些替代方案。 Async

  • 问题内容: 在ASP.net AJAX项目(WebForms)中, 我有一个UpdatePanel,在UpdatePanel中,我有多个带有UpdatePanels的嵌套控件,基本上,我有控件树。父控件非常巨大,并且是站点中非常重要的部分,我无法触摸它(并且它在很多地方都可以重复使用),UpdatePanel应该保持在当前位置。 更新面板中的子控件具有相互隔离的功能(它们也由UpdatePanel

  • 问题内容: 我对android中这种简单的经常发生的情况有疑问。 我们有一个main活动,我们调用一个AsyncTask以及mainactivity的引用,以便AsyncTask可以更新MainActivity上的视图。 我将把事件分解成几个步骤 MainActivity创建一个AyncTask,并将其引用传递给它。 AysncTask,开始工作,例如下载十个文件 用户更改了设备的方向。这将导致A

  • 我有一个带有复选框的列表视图。对于每个复选框(大约有3个),它都有一个特定的AsyncTask。 我从来不知道用户选择了什么复选框,所以我不能把AlertDialog放在异步任务的末尾,因为我从来不知道用户是只选择了一个复选框,还是两个或三个。 因为AsyncTask是分步执行的(只有当第一个Async任务完成时,第二个Async任务才开始),所以我考虑在所有任务的末尾添加一个带有AlertDia

  • 我已经为android Studio创建了一个webview应用程序。但没有加载web URL。错误为NET::ERR_ACCESS_DENIED。有谁能帮忙吗