iOS Groupe d'expédition


Exemple

DispatchGroup permet la synchronisation globale du travail. Vous pouvez les utiliser pour soumettre plusieurs éléments de travail différents et effectuer un suivi lorsqu'ils sont tous terminés, même s'ils peuvent s'exécuter sur des files d'attente différentes. Ce comportement peut être utile lorsque la progression ne peut pas être effectuée tant que toutes les tâches spécifiées ne sont pas terminées.

Un scénario, si cela peut être utile, si vous avez plusieurs appels de services Web qui doivent tous être terminés avant de continuer. Par exemple, vous devez télécharger plusieurs ensembles de données devant être traités par une fonction. Vous devez attendre que tous les services Web soient terminés avant d'appeler la fonction pour traiter toutes les données reçues.

Swift 3

func doLongTasksAndWait () {
    print("starting long running tasks")
    let group = DispatchGroup()          //create a group for a bunch of tasks we are about to do
    for i in 0...3 {                     //launch a bunch of tasks (eg a bunch of webservice calls that all need to be finished before proceeding to the next ViewController)
        group.enter()                    //let the group know that something is being added
        DispatchQueue.global().async {   //run tasks on a background thread
            sleep(arc4random() % 4)      //do some long task eg webservice or database lookup (here we are just sleeping for a random amount of time for demonstration purposes)
            print("long task \(i) done!")
            group.leave()                //let group know that the task is finished
        }
    }
    group.wait()                         //will block whatever thread we are on here until all the above tasks have finished (so maybe dont use this function on your main thread)
    print("all tasks done!")
}

Sinon, si vous ne souhaitez pas attendre la fin des groupes, mais que vous souhaitez exécuter une fonction une fois toutes les tâches terminées, utilisez la fonction notify à la place du group.wait()

group.notify(queue: DispatchQueue.main) { //the queue: parameter is which queue this block will run on, if you need to do UI updates, use the main queue
    print("all tasks done!")              //this will execute when all tasks have left the group
}

Exemple de sortie:

starting long running tasks
long task 0 done!
long task 3 done!
long task 1 done!
long task 2 done!
all tasks done!

Pour plus d'informations, reportez-vous à la documentation Apple ou à la rubrique associée.