У меня есть две функции (или задачи), которые я хочу запускать одну за другой, и я использую 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")
}
}