2017-10-28 4 views
0

Ich habe ein Projekt mit 2 Gruppen von asynchronen Funktionen, die in der Reihenfolge ausgeführt werden sollten. Nachdem alle asynchronen Funktionen ausgeführt wurden, versuche ich function3 auszuführen.Fehler bei der Behandlung einer Reihe von asynchronen Funktionen mit dispatchGroup in Swift

ist hier ein hohes Maß Struktur meines Code:

class VC: UIViewController { 
    let dispatchGroup = DispatchGroup() 
    let dispatchGroup2 = DispatchGroup() 
    override func viewDidLoad() { 

     asyncFunc1() 

     dispatchGroup.notify(queue: .main) { 
      asyncFunc2() 
     } 

     dispatchGroup2.notify(queue: .main) { 
      print("all done") 
      function3() 
     } 
    } 

    func asyncFunc1() { 
     for item in itemArray { 
      dispatchGroup.enter() 
      Alamofire.request(urlString).responseString { response in 
       dispatchGroup.leave() 
      } 
     } 
    } 

    func asyncFunc2() { 
     for item in itemArray2 { 
      dispatchGroup2.enter() 
      Alamofire.request(urlString).responseString { response in 
       dispatchGroup2.leave() 
      } 
     } 
    } 
} 

Meine Erwartung ist, dass Funktionen in der Reihenfolge der asyncFunc1() -> asyncFunc2() -> function3() laufen. Wenn ich diese App tatsächlich ausführen, sehe ich, dass dispatchGroup2.notify am Anfang ausgelöst wird, wenn Programm ausgeführt wird und nie aufgerufen wird, nachdem asyncFunc2 fertig ist. Was ist hier falsch? Ich habe versucht, mit einer dispatchGroup Variable anstelle von 2 (dispatchGroup und dispatchGroup2) zu tun, aber das hat nicht wieder funktioniert.

Antwort

1

würde ich ein einfaches Refactoring encapsulate diejenigen DispatchGroups in den entsprechenden asynchronen Funktionen empfehlen:

func asyncFunc(completion: @escaping() -> Void) { 
    let dispatchGroup = DispatchGroup() 
    for ... { 
     dispatchGroup.enter() 
     request ... { 
      dispatchGroup.leave() 
     } 
    } 
    dispatchGroup.notify(queue: .main) { 
     completion() // Async function completed! 
    } 
} 

Das in einem sehr schönen/kompakte Top-Level-Lösung führen würde:

asyncFunc1 { 
    self.asyncFunc2 { 
     print("all done") 
     self.function3() 
    } 
} 

Anfangsfehler. Ihr ursprüngliches Problem wurde verursacht, indem notify(queue:)vor die entsprechende enter() Methode aufgerufen wird. Ihre Versandgruppe war vorbei, noch bevor es begann;)

+1

Funktioniert wie ein Charme! Vielen Dank, dass Sie auf meinen Fehler hingewiesen und eine neue Antwort vorgeschlagen haben. Ich wünschte, ich könnte das mehrmals wiederholen;) – user7418039

Verwandte Themen