2016-07-01 3 views
0

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!

+1

Hallo @zsong, beantwortet dies Ihre Frage? http://stackoverflow.com/questions/32642782/warting-for-multiple-asynchronous-download-tasks – jtbandes

+0

@jtbandes Ich versuchte es. Aber dispatch_group_notify gibt die Nachricht unmittelbar vor dem Abschluss der asynchronen Jobs aus. – zsong

+1

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

Antwort

3

Sie sollten Versandgruppen wie im folgenden Beispiel verwenden. Stellen Sie sicher, dass die Anzahl der eingehenden/ausgehenden Anrufe übereinstimmt, andernfalls wird Ihr Code im Benachrichtigungsblock niemals ausgeführt.

let dispatchGroup = dispatch_group_create() 

for _ in 0..<10 { 
    dispatch_group_enter(dispatchGroup) 

    // Do some async tasks 
    let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC))) 

    dispatch_after(delay, dispatch_get_main_queue(), { 
     self.myfunc() 
     dispatch_group_leave(dispatchGroup) 
    }) 
} 

dispatch_group_notify(dispatchGroup, dispatch_get_main_queue()) { 
    // The code here will run after all tasks are completed 
} 
+0

Thx. Ich habe ziemlich genau dasselbe gemacht und ich habe keine Ahnung, warum es letzte Nacht nicht geklappt hat ... – zsong

Verwandte Themen