Die einzige Reihenfolge, die hier garantiert wird, ist, dass 4 nach 2 passieren wird, und 3 nach 1. Weil Ihre eigene Warteschlange und die Hauptwarteschlange seriell sind - und deshalb Blöcke in der ausgeführt werden Reihenfolge, in der sie geplant waren.
Da jedoch Ihre serialQueue
wird Blöcke auf einem Hintergrund Thread ausführt (versuchen, den aktuellen Thread logging) - Ihre 1 und 3 Operationen geschieht gleichzeitig mit 2 und 4-Operationen.
Daher ist die genaue Reihenfolge zwischen den Vorgängen in Ihrer seriellen Warteschlange und den Vorgängen in der Hauptwarteschlange nicht definiert.
Wenn Sie Ihre dispatch_async
geändert Haupt Warteschlange zu schicken, dann erhalten Sie in der Tat die Bestellung Sie wollen (2, 4, 1, 3) - wie die Blöcke, die Sie für die Hauptwarteschlange wird warten müssen, planen zu Beenden Sie die Ausführung der aktuellen Aufgabe (Ihre 2 und 4 Operationen + was auch immer die Hauptwarteschlange tut).