Wie der Versand über die main queue synchron, ohne einen deadlock?

Muss ich Versand Sie einen block auf der main queue synchron. Ich weiß nicht, ob ich bin derzeit auf der main-thread oder nicht. Die naive Lösung sieht wie folgt aus:

dispatch_sync(dispatch_get_main_queue(), block);

Aber wenn ich derzeit innerhalb eines Blocks ausgeführt, die auf das Haupt-queue, dieser Aufruf erzeugt eine Sackgasse. (Die synchron-Versand wartet, bis der block zu Ende, aber der block nicht auch noch anfangen zu laufen, da warten wir auf die aktuellen zu beenden.)

Den offensichtlichen nächsten Schritt ist zu prüfen, für die aktuelle Warteschlange:

if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
    block();
} else {
    dispatch_sync(dispatch_get_main_queue(), block);
}

Dies funktioniert, aber es ist hässlich. Bevor ich zumindest verstecken Sie sich hinter ein paar benutzerdefinierte Funktion, gibt es nicht eine bessere Lösung für dieses problem? Ich betone, dass ich nicht leisten können, den Versand der block asynchron – die app ist in einer situation, wo die asynchron wird ausgelöst, blockieren würde, die ausgeführt werden, "zu spät".

InformationsquelleAutor der Frage zoul | 2012-04-26

Schreibe einen Kommentar