以下代码无法打印..In Background..
并打印..Executing..
我知道我遗漏了一些非常基本的东西。我读了同样的其他问题,但他们似乎都在运行相同的代码。
一些可能无效的重复here
我已经提取了相关的确切代码,我认为不需要任何其他代码来帮助调试它。
func execute() {
print("..Executing..")
DispatchQueue.global(qos: .background).async {
self.doInBackground()
DispatchQueue.main.async {
self.doAfterBackgroundCompletes()
}
}
}
func doInBackground() {
print("..In Background..")
修改
以下作品。但我想知道不应该在后台线程中使用http请求。如果http请求不在后台线程中导致问题,则在Android中获得Atleast。
func execute() {
print("..Executing..")
self.doInBackground()
self.doAfterBackgroundCompletes()
// DispatchQueue.global(qos: .background).async {
// DispatchQueue.main.async {
// self.doInBackground()
// self.doAfterBackgroundCompletes()
// }
// }
}
答案 0 :(得分:3)
我在Swift 4中看到了相同的行为。虽然我无法解释它,但是将QoS从.background
更改为.default
确实执行了,这解决了我的问题。我知道这不是一个解决方案,但我希望这对你来说是合理的解决方法。
答案 1 :(得分:2)
也许我错过了什么? 我刚刚运行了以下代码:
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..
你从哪里调用execute
函数?
答案 2 :(得分:1)
这是工作代码。
DispatchQueue.global().async(execute: {
print("global...")
DispatchQueue.main.sync{
print("main...")
}
})
答案 3 :(得分:0)
我也有这个问题并通过创建自定义调度队列来解决它,但我相信它可以通过增加任务优先级来缓解(如果不能彻底解决)。
我认为问题在于全局调度队列被很多东西使用,而全局队列的并发任务数量有限。通过将任务添加到.background
队列中,只有在没有.utility
或更高优先级任务的情况下,您的项目才会运行。
当出于某种原因要么排队的优先级较高的任务,或者碰巧正在花费过多时间的任务时,这就成了问题。这可能是任何队列中的问题,尽管全局队列可能更有可能出现此问题,因为更多事情会使用它。
这是来自Apple's docs,在创建和管理调度队列标题下:
并发队列在任何给定时刻执行的实际任务数是可变的,并且可以随着应用程序中的条件发生变化而动态更改。许多因素会影响并发队列执行的任务数,包括可用核心数,其他进程正在完成的工作量,以及其他串行调度队列中任务的数量和优先级。
...
正如您所料,高优先级并发队列中的任务先于默认队列和低优先级队列中的任务执行。同样,默认队列中的任务在低优先级队列中的任务之前执行。