2017-01-26 1 views
0

Disons que j'ai 3 différentes tâches asynchrones que je veux faire avant d'appeler une fonction. Je suis au courant d'utiliser des groupes d'expédition à faire une telle chose si ces tâches étaient dans une boucle,Puis-je utiliser le groupe d'expédition non en boucle?

var dispatchGroup = DispatchGroup() 

    for task in tasks { 
     dispatchGroup.enter() 

     DoSomeTask { (error, ref) -> Void in 
      dispatchGroup.leave() 
     } 
    } 

    dispatchGroup.notify(queue: DispatchQueue.main, execute: { 
     DoSomeFunction() 
    }) 

Cependant, je suis confus sur la façon dont vous feriez cela si ces tâches étaient tous dans la même fonction mais n'a pas à faire avec l'autre, comme pousser 3 valeurs différentes à votre base de données. Quelque chose comme ceci:

updateDatabase() { 
     var dispatchGroup = DispatchGroup() 

     DoTask1 { (error, ref) -> Void in   
     } 

     DoTask2 { (error, ref) -> Void in   
     } 

     DoTask3 { (error, ref) -> Void in   
     } 
    } 

Où mettriez-vous la déclaration leave et enter dans ce cas comme cela?

Répondre

2

Dans ce cas, votre fonction updateDatabase() a besoin d'un bloc d'achèvement que vous appelez après tout la mise à jour sont effectuées:

updateDatabase(onSccess completion:() -> Void) { 
    var dispatchGroup = DispatchGroup() 

    dispatchGroup.enter() 
    DoTask1 { (error, ref) -> Void in 
     dispatchGroup.leave()   
    } 

    dispatchGroup.enter() 
    DoTask2 { (error, ref) -> Void in   
     dispatchGroup.leave() 
    } 

    dispatchGroup.enter() 
    DoTask3 { (error, ref) -> Void in   
     dispatchGroup.leave() 
    } 

    dispatchGroup.notify(queue: DispatchQueue.main) { 
     completion() 
    } 
} 

Vous qu'appeler comme ceci:

updateDatabase() { 
    //do somthing after updating 
}