Ios Swift 3.0 async Dispatch.global未运行

Ios Swift 3.0 async Dispatch.global未运行,ios,swift,swift3,Ios,Swift,Swift3,以下代码不打印。在后台..并打印。正在执行.. 我知道我错过了一些非常基本的东西。我读了同样的其他问题,但它们似乎都运行相同的代码 一些可能的重复没有帮助 我已经提取了问题中的确切代码,我认为不需要更多的东西来帮助调试 func execute() { print("..Executing..") DispatchQueue.global(qos: .background).async { self.doInBackground()

以下代码不打印
。在后台..
并打印
。正在执行..

我知道我错过了一些非常基本的东西。我读了同样的其他问题,但它们似乎都运行相同的代码

一些可能的重复没有帮助

我已经提取了问题中的确切代码,我认为不需要更多的东西来帮助调试

func execute() {
        print("..Executing..")
        DispatchQueue.global(qos: .background).async {
           self.doInBackground()

            DispatchQueue.main.async {
                self.doAfterBackgroundCompletes()
            }
        }
    }

 func doInBackground() {

        print("..In Background..")
编辑

下面的方法很有效。但是我想知道http请求不应该在后台线程中吗。至少在Android中,如果http请求不在后台线程中,则会导致问题

func execute() {
        print("..Executing..")
        self.doInBackground()
        self.doAfterBackgroundCompletes()

//        DispatchQueue.global(qos: .background).async {
//            DispatchQueue.main.async {
//                self.doInBackground()
//                self.doAfterBackgroundCompletes()
//            }
//        }
    }
这是工作代码

DispatchQueue.global().async(execute: {

    print("global...")

    DispatchQueue.main.sync{
        print("main...")
    }

})
这是工作代码

DispatchQueue.global().async(execute: {

    print("global...")

    DispatchQueue.main.sync{
        print("main...")
    }

})

也许我错过了什么? 我刚刚运行了以下代码:

func execute() {
    print("..Executing..")
    DispatchQueue.global(qos: .background).async {
        self.doInBackground()

        DispatchQueue.main.async {
            self.doAfterBackgroundCompletes()
        }
    }
}

func doInBackground() {
    print("..In Background..")
}

func doAfterBackgroundCompletes() {
    print("..COMPLETED..")
}
结果是:

..Executing..
..In Background..
..COMPLETED..

您从哪里调用执行函数?

可能我遗漏了什么? 我刚刚运行了以下代码:

func execute() {
    print("..Executing..")
    DispatchQueue.global(qos: .background).async {
        self.doInBackground()

        DispatchQueue.main.async {
            self.doAfterBackgroundCompletes()
        }
    }
}

func doInBackground() {
    print("..In Background..")
}

func doAfterBackgroundCompletes() {
    print("..COMPLETED..")
}
结果是:

..Executing..
..In Background..
..COMPLETED..

您从何处调用
执行
函数?

我在Swift 4中看到了相同的行为。虽然我无法解释它,但将QoS从
.background
更改为
.default
确实执行了,这解决了我的问题。我知道这本身不是一个解决方案,但我希望这对您来说是一个合理的解决方案。

我在Swift 4中看到过同样的行为。虽然我无法解释它,但将QoS从
.background
更改为
.default
确实执行了,这解决了我的问题。我知道这本身不是一个解决方案,但我希望这对您来说是一个合理的解决方案。

我也遇到了这个问题,并通过创建一个自定义调度队列解决了它,尽管我相信可以通过增加任务优先级来缓解(如果不能彻底解决的话)

我认为问题在于全局调度队列被许多事物使用,并且全局队列具有有限数量的并发任务。通过将任务添加到
.background
队列中,仅当没有
.utility
或更高优先级的任务时,项目才会运行

由于某种原因,如果有许多优先级更高的任务正在排队,或者这些任务恰好花费了过多的时间,那么这就会成为一个问题。这在任何队列中都可能是一个问题,尽管全局队列可能更容易出现此问题,因为将有更多的东西使用它

这来自“创建和管理调度队列”标题下的:

并发队列在任何给定时刻执行的实际任务数都是可变的,并且可以随着应用程序中的条件的变化而动态变化。许多因素会影响并发队列执行的任务数量,包括可用内核的数量、其他进程完成的工作量以及其他串行调度队列中任务的数量和优先级

正如您所料,高优先级并发队列中的任务在默认队列和低优先级队列中的任务之前执行。类似地,默认队列中的任务在低优先级队列中的任务之前执行


我也遇到了这个问题,并通过创建一个定制的调度队列解决了它,尽管我相信通过增加任务优先级可以缓解(如果不能彻底解决的话)

我认为问题在于全局调度队列被许多事物使用,并且全局队列具有有限数量的并发任务。通过将任务添加到
.background
队列中,仅当没有
.utility
或更高优先级的任务时,项目才会运行

由于某种原因,如果有许多优先级更高的任务正在排队,或者这些任务恰好花费了过多的时间,那么这就会成为一个问题。这在任何队列中都可能是一个问题,尽管全局队列可能更容易出现此问题,因为将有更多的东西使用它

这来自“创建和管理调度队列”标题下的:

并发队列在任何给定时刻执行的实际任务数都是可变的,并且可以随着应用程序中的条件的变化而动态变化。许多因素会影响并发队列执行的任务数量,包括可用内核的数量、其他进程完成的工作量以及其他串行调度队列中任务的数量和优先级

正如您所料,高优先级并发队列中的任务在默认队列和低优先级队列中的任务之前执行。类似地,默认队列中的任务在低优先级队列中的任务之前执行