【发布时间】:2018-06-26 00:19:36
【问题描述】:
我有多个任务要放入在后台线程中运行的串行/并发队列中。每个任务将 fetch 来自 api(async) 的数据,然后是 copyItem(sync,取决于 fetch 的资源)。下面的代码阻塞了主线程。但是,如果我只将 copyItem 分配给队列,则不会阻塞主线程。为什么我不能在后台线程中运行整个块?
let serialQueue = DispatchQueue(label: "queue", qos: .background)
tableView.selectedRowIndexes.forEach { row in
serialQueue.async {
InitData.fetch("someUrl") { initData in
let fileManager = FileManager()
do {
try fileManager.copyItem(atPath: "pathA", toPath: "pathB")
} catch let error {
print(error)
}
}
}
}
这不会阻塞主线程:
tableView.selectedRowIndexes.forEach { row in
InitData.fetch("someUrl") { initData in
let fileManager = FileManager()
let workItem = DispatchWorkItem {
do {
try fileManager.copyItem(atPath: "pathA", toPath: "pathB")
} catch let error {
print(error)
}
}
DispatchQueue.global(qos: .background).async(execute: workItem)
}
}
【问题讨论】:
-
如果在您的第一个代码块中,您可以在调用
print(Thread.current.isMainThread)之前调用:copyItem -
返回真