Swift: forzar la ejecución síncrona de trabajo y la posterior representación de la interfaz de usuario

Tengo un fragmento de código que sigue el flujo de trabajo:

for index in 0..<self!.recordedData.count {
//Do work here that involves fetching data from coredata and prerendering an image for each index
}
reloadUIWithData()

El flujo de trabajo está destinado a ser:

Todo el trabajo en el ciclo for se completará

ReloadUIWithData que se ejecutará.

Sin embargo, se llama a la función reloadUIWithData antes de que finalice el trabajo en el bucle. ¿Hay alguna manera de exigir que todo el trabajo esté completamente terminado dentro del bucle for y luego ejecutar reloadUIWithData después?

He intentado la siguiente extensión DispatchQueue:

static func background(delay: Double = 0.0, background: (()->Void)? = nil, completion: (() -> Void)? = nil) {

    DispatchQueue.global(qos: .background).sync {
        background?()
        if let completion = completion {
            DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: {
                completion()
            })
        }
    }
}

Por medio de

DispatchQueue.background(delay: 0.01, background: {
for index in 0..<self!.recordedData.count {
    //Do work here that involves fetching data from coredata and rendering an image for each index
    }
}, completion:{
reloadUIWithData()
}

Pero esto no parece funcionar de manera escalable. Si bien funciona si el parámetro de demora se establece en algo así como 0.5, establecer el parámetro de demora en un valor pequeño como 0.01 provoca el mismo problema. Me gustaría utilizar un método más robusto que establecer un retraso aleatorio y espero que todo el trabajo se realice dentro de ese lapso de tiempo.

Cualquier ayuda sería muy apreciada. ¡Gracias

Respuestas a la pregunta(1)

Su respuesta a la pregunta