J'ai deux appels API comme suit:dispatch_async comprendre l'ordre d'exécution
-(void) doTask1{
dispatch_async(queueSerial, ^{ //B1
[fileObj setFileInfo:file];
});
}
-(void) doTask2{
dispatch_async(queueSerial, ^{ //B2
[fileObj getFileInfo:fileName completion:^(NSError *error) {
dispatch_async(queueSerial2, ^{
//completion work C1
});
}]
});
}
Maintenant, ma question est, de ce que je comprends déjà en lisant GCD, si un processus appelle doTask1
et immédiatement après les appels doTask2
, il se traduira par les deux en file d'attente et B1
en avance B2
.
Cependant, est de s'assurer que B1
est entièrement exécuté avant que B2
commence à s'exécuter? Parce que le fichier mis à jour par B1
est utilisé par B2
. Si B2
commence à s'exécuter avant que B1
soit complètement terminé, cela peut entraîner des problèmes.
Ou est-il préférable de faire
-(void) doTask1{
dispatch_sync(queueSerial, ^{B1});
}
-(void) doTask2{
dispatch_sync(queueSerial, ^{B2});
}
Merci pour votre commentaire. J'ai modifié ma question pour ajouter plus de détails sur le code. La chose que je ne comprends pas est votre commentaire sur "Il n'y a aucune garantie concernant la relation entre ceux-ci" Qu'est-ce que cela signifie? – ExceptionHandler
Je veux dire que, dans le cas asynchrone, quel que soit le code appelle doTask1(), doTask2() peut avoir fait diverses autres opérations avant que le travail envoyé soit terminé. Dans le cas de la synchronisation, l'appelant s'arrête également jusqu'à la fin de vos opérations de file d'attente série. –
Je vois. Je comprends cette partie. Si B2 envoie son gestionnaire d'achèvement à une autre file d'attente, est-il possible que ce bloc d'achèvement soit exécuté avant la fin de B1? Y at-il un moyen de s'assurer que cela n'arrivera pas et que le bloc d'achèvement dans B2 attend jusqu'à ce que B1 soit fini? – ExceptionHandler