【发布时间】:2018-12-29 18:05:17
【问题描述】:
我有两个功能(或任务)要一个接一个地运行,我正在使用 DispatchGroup 跟踪它们并在它们完成时通知我。现在它们正在主线程中完成,但我想在后台线程中运行这些任务。我该怎么做呢?我尝试了几种方法,但它们要么同时运行,要么在第一个完成后出现异常错误。以下代码一个接一个地执行任务,但如果我在函数内部调用 Thread.current,我可以看到它们正在主线程中运行。
@objc func doWorkFunctions(){
taskGroup.enter()
DispatchQueue.global(qos: .background).sync {
self.firstFunction {
self.taskGroup.leave()
}
}
taskGroup.enter()
DispatchQueue.global(qos: .background).sync {
self.secondFunction {
self.taskGroup.leave()
}
}
taskGroup.notify(queue: .main) {
print("All tasks completed")
}
}
如果我使用以下代码,它们会同时运行,但在后台线程中。
@objc func doWorkFunctions(){
taskGroup.enter()
DispatchQueue.global(qos: .background).async {
self.firstFunction {
self.taskGroup.leave()
}
}
taskGroup.enter()
DispatchQueue.global(qos: .background).async {
self.secondFunction {
self.taskGroup.leave()
}
}
taskGroup.notify(queue: .main) {
print("All tasks completed")
}
}
我一直在寻找和寻找,但我似乎无法找到我的问题的答案或关于这件事的明确性。有人可以就这里发生的事情提供一些指导。这些是有问题的功能。他们模拟一项长期任务来练习跟踪进度。
func firstFunction(completion: @escaping()->Void){
print(Thread.current)
if childProgressOne.isCancelled { return }
for i in 1...5 {
sleep(1)
childProgressOne.completedUnitCount = Int64(i * 20)
print("Child Progress One: \(childProgressOne.fractionCompleted)")
print("Total Progress: \(totalProgress.fractionCompleted)")
}
completion()
}
func secondFunction(completion: @escaping()->Void){
print(Thread.current)
if childProgressTwo.isCancelled { return }
for i in 1...5 {
sleep(1)
childProgressTwo.completedUnitCount = Int64(i * 20)
print("Child Progress Two: \(childProgressTwo.fractionCompleted)")
print("Total Progress: \(totalProgress.fractionCompleted)")
}
completion()
}
这也按顺序执行它们,但是在函数内部调用 Thread.current 会告诉我它们正在主线程中执行,即使它们被调用到后台线程也是如此。
@objc func doWorkFunctions(){
DispatchQueue.global(qos: .background).sync {
self.taskGroup.enter()
self.firstFunction {
self.taskGroup.leave()
}
self.taskGroup.enter()
self.secondFunction {
self.taskGroup.leave()
}
}
taskGroup.notify(queue: .main) {
print("All tasks completed")
}
}
【问题讨论】:
-
当你把它们放在后台线程中时,它们会同时运行。我不完全明白这个问题。
-
@George_E 我不希望它们同时运行。我希望它们一个接一个地在后台运行。
-
如果您将第一个代码块与
sync一起使用并将两者放在一个DispatchQueue块中,它是否有效? -
一个接一个地执行它们,但由于某种原因在函数内部调用 Thread.current 表示它仍在主线程中。
-
@George_E 用建议更新了问题。
标签: swift