Как уже отмечали другие, на каком потоке работает код, это не имеет значения. Подобные проблемы с производительностью, как правило, зависят от простого последовательного выполнения задач по одному, чтобы они не перекрывались и не сталкивались с ресурсами.
Самое простое решение - создать последовательную очередь. (напечатано в Safari, поэтому стоит каждого копейки, за которое вы заплатили)
let queue = DispatchQueue(label: "db.update", qos: .utility, attributes: [], autoreleaseFrequency: .inherit, target: nil)
var progress: Int = 0
queue.sync {
// Dome some work, then update the UI
progress = 2
DispatchQueue.main.async(execute: {
// label.text = "did something"
// progress.doubleValue = Double(progressCounter)
})
}
queue.sync {
// Do some more work
progress += 1
// This won't execute until the first block has finished
}
queue.sync {
// Even more work
progress += 1
}
queue.sync {
// And so on...
progress += 1 // This block might, for example, notify the system that everything has finished
print("progress is finally \(progress)")
}
Ключ заключается в том, что каждый блок выполняется последовательно (поскольку очередь не является «параллельной»), и следующий блок не начнется, пока не закончится предыдущий. Каждый блок может выполняться или не выполняться в одном и том же потоке, но это не должно иметь значения.
Результаты / прогресс одного блока можно легко передать следующему блоку с помощью переменных закрытия.