Intuitiv habe ich versucht, so etwas wie dieses:Woher wissen Sie, dass alle versandten Aufgaben abgeschlossen sind, wenn dispatch_after in einer Schleife verwendet wird?
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
for i in 0..<10 {
CATransaction.begin()
let now = DISPATCH_TIME_NOW
CATransaction.setCompletionBlock {
var delay = dispatch_time(now, 0)
dispatch_after(delay, dispatch_get_main_queue(), {
myfunc()
dispatch_semaphore_signal(semaphore)
})
}
CATransaction.commit()
}
for i in 0..<10 {
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
}
//task will be executed after 10 jobs are completed.
Aber es dispatch_semaphore_wait tatsächlich blockiert dispatch_after von gerade ausgeführt sein scheinen. Wie warten, bis alle 10 asynchronen Jobs fertig sind?
Danke!
Hallo @zsong, beantwortet dies Ihre Frage? http://stackoverflow.com/questions/32642782/warting-for-multiple-asynchronous-download-tasks – jtbandes
@jtbandes Ich versuchte es. Aber dispatch_group_notify gibt die Nachricht unmittelbar vor dem Abschluss der asynchronen Jobs aus. – zsong
Das hängt davon ab, wo Sie dispatch_group_leave ablegen. Es sollte nach der Arbeit sein (wie dort, wo du gerade das semaphore_signal hast). – jtbandes