C'est en fait plutôt très simple.
Lorsque vous appelez par exemple la méthode reloadData de UICollectionView ou la méthode invalidateLayout de la disposition, vous procédez comme suit:
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
});
Pourquoi cela fonctionne:
Le thread principal (où nous devons faire toutes les mises à jour de l'interface utilisateur) héberge la file d'attente principale, qui est de nature série, c'est-à-dire qu'elle fonctionne à la manière FIFO. Ainsi, dans l'exemple ci-dessus, le premier bloc est appelé, ce qui fait que notre reloadData
méthode est invoquée, suivi de tout autre élément dans le deuxième bloc.
Maintenant, le thread principal se bloque également. Donc, si vous prenez reloadData
3s pour s'exécuter, le traitement du deuxième bloc sera différé de ces 3s.