Основной шаблон в Swift - выполнять работу, такую как загрузка в фоновом потоке, затем вызывать функцию завершения в главном потоке и продолжать работу в зависимости от того, успешно ли завершена загрузка.
Обычно выЯ перезвоню в основной поток, если вам нужно что-то сделать с пользовательским интерфейсом, например, установить индикатор прогресса (что должно происходить в главном потоке).
Так что-то вроде этого:
func uploadInBackground(_ images: [Image], completion: @escaping (_ success: Bool) -> Void) {
DispatchQueue.global(qos: .background).async {
var success = true
// upload the images but stop on any error
for image in images {
success = uploadImage(image) // upload your images somehow
guard success else { break }
}
DispatchQueue.main.async {
completion(success)
}
}
}
func mainThreadUploader() {
let images = [Image(), Image()] // get your images from somewhere
// we are on the main thread where UI operations are ok, so:
startProgressIndicator()
uploadInBackground(images) { success in
// this callback is called on the main thread, so:
stopProgressIndicator()
guard success else { return }
// images uploaded ok, so proceed with functions that depend on
// the upload(s) completing successfully:
function1()
function2()
}
}