J'ai besoin d'envoyer un bloc sur la file d'attente principale, de façon synchrone. Je ne sais pas si je suis actuellement en cours d'exécution sur le thread principal ou non. La solution naïve ressemble à ceci:
dispatch_sync(dispatch_get_main_queue(), block);
Mais si je suis actuellement à l'intérieur d'un bloc en cours d'exécution sur la file d'attente principale, cet appel crée un blocage. (Synchrone expédition attend pour le bloc à la fin, mais le bloc ne même pas commencer à courir, puisque nous sommes en attente de l'actuel à la fin.)
L'étape logique suivante est de vérifier pour la file d'attente en cours:
if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
block();
} else {
dispatch_sync(dispatch_get_main_queue(), block);
}
Cela fonctionne, mais c'est moche. Avant, j'ai au moins le cacher derrière une certaine fonction personnalisée, n'est-il pas une meilleure solution pour ce problème? Je tiens à souligner que je ne peux pas se permettre de l'envoi de ce bloc de manière asynchrone – l'app est dans une situation où le mode asynchrone distribué bloc exécuté "trop tard".