Das Versenden eines Blocks in die Hauptwarteschlange erfolgt normalerweise aus einer Hintergrundwarteschlange, um zu signalisieren, dass einige Hintergrundverarbeitungen abgeschlossen sind, z
- (void)doCalculation
{
//you can use any string instead "com.mycompany.myqueue"
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
dispatch_async(backgroundQueue, ^{
int result = <some really long calculation that takes seconds to complete>;
dispatch_async(dispatch_get_main_queue(), ^{
[self updateMyUIWithResult:result];
});
});
}
In diesem Fall führen wir eine lange Berechnung in einer Hintergrundwarteschlange durch und müssen unsere Benutzeroberfläche aktualisieren, wenn die Berechnung abgeschlossen ist. Das Aktualisieren der Benutzeroberfläche muss normalerweise von der Hauptwarteschlange aus erfolgen, damit wir mit einem zweiten verschachtelten dispatch_async ein Signal an die Hauptwarteschlange senden.
Es gibt wahrscheinlich andere Beispiele, bei denen Sie möglicherweise an die Hauptwarteschlange zurücksenden möchten, dies geschieht jedoch im Allgemeinen auf diese Weise, dh innerhalb eines Blocks, der an eine Hintergrundwarteschlange gesendet wird.
- Hintergrundverarbeitung beendet -> Benutzeroberfläche aktualisieren
- Datenblock in der Hintergrundwarteschlange verarbeitet -> Hauptwarteschlange signalisieren, um den nächsten Block zu starten
- Eingehende Netzwerkdaten in der Hintergrundwarteschlange -> Hauptwarteschlange signalisieren, dass die Nachricht angekommen ist
- etc etc.
Warum möchten Sie möglicherweise von der Hauptwarteschlange aus in die Hauptwarteschlange versenden ? Nun, im Allgemeinen würden Sie dies nicht tun, obwohl Sie dies möglicherweise tun könnten, um einige Arbeiten für das nächste Mal in der Ausführungsschleife zu planen.