2017-01-25 1 views
0

So führen Sie eine Reihe von Dispatch-Codes nacheinander aus. Zum Beispiel:Dispatch-Haupt in Sequenz ausführen

Dispatch.main.async{ 
//call API, it may takes 5-10 seconds.. 
//do something.. 
    print("done 1") 
} 

Dispatch.main.async{ 
//call API, it may takes 5-10 seconds.. 
//do something 
    print("done 2") 
} 

Dispatch.main.asyncAfter{ 
    print("completed") 
} 

Output: 
completed 
done1 
done2 

Expected output: 
done1 
done2 
completed 

ich die Haupt verwenden, weil ‚etwas tun‘ ist die resut zu UI füllen. Ich habe versucht, global() verwendet, aber die 'abgeschlossen' immer zuerst ausgeführt und nicht geeignet, Versand Zeitverzögerung zu verwenden, da nicht bestätigen kann, wie lange die API-Aufrufzeiten. benötigen einen Vorschlag in swift ~

+0

Warum nicht Sie Abschluss-Handler verwenden? Probieren Sie es aus, viele SO-Posts sind verfügbar. –

+2

Da die Hauptwarteschlange eine serielle Dispatch-Warteschlange ist, können Sie 'Dispatch.main.async()' auch für Ihren dritten Block verwenden, oder Sie können eine Dispatch-Gruppe verwenden – Paulw11

Antwort

0
DispatchQueue.main.async{ 
      //call API, it may takes 5-10 seconds.. 
      //do something.. 
      print("done 1") 
     } 

     DispatchQueue.main.async{ 
      //call API, it may takes 5-10 seconds.. 
      //do something 
      print("done 2") 
     } 

     DispatchQueue.main.asyncAfter(deadline: .now() + 0.1){ 
      print("completed") 
     } 

It will execute in sequence

+0

Dies sieht so aus, als ob es funktioniert, aber wenn 'done 1' und 'done 2' würde tatsächlich 5-10 Sekunden dauern, du würdest immer noch' completed' zuerst drucken – Russell

+0

ja, benutze nur diese Codes, aber ich kann mein erwartetes Ergebnis nicht erreichen. Ich möchte wirklich ein Stück Code nach dem Hauptversand fertigstellen . –

+0

Danke. für dich erinnert. – Raja