De hecho, es bastante simple.
Cuando, por ejemplo, llama al método reloadData de UICollectionView o al método invalidateLayout de su diseño, hace lo siguiente:
dispatch_async(dispatch_get_main_queue(), ^{
[self.collectionView reloadData];
});
dispatch_async(dispatch_get_main_queue(), ^{
//your stuff happens here
//after the reloadData/invalidateLayout finishes executing
});
Por qué esto funciona:
El hilo principal (que es donde deberíamos hacer todas las actualizaciones de la interfaz de usuario) alberga la cola principal, que es de naturaleza serial, es decir, funciona en formato FIFO. Entonces, en el ejemplo anterior, se llama al primer bloque, que tiene nuestro reloadData
método invocado, seguido de cualquier otra cosa en el segundo bloque.
Ahora el hilo principal también se bloquea. Entonces, si reloadData
tarda 3 segundos en ejecutarse, el procesamiento del segundo bloque será aplazado por esos 3 segundos.