J'ai une méthode:Utilisation de la file d'attente série d'expédition pour appeler une méthode qui accepte le bloc d'achèvement en tant que paramètre
-(void) dataForRequest:(NSMutableURLRequest*)url withCallback:(void (^)(NSData* data))callbackBlock`
qui reçoit les données de l'URL en arrière-plan, puis appelle la callbackBlock
avec les données reçues.
J'appelle cela sur une file d'attente de série comme:
dispatch_async(my_serial_queue(), ^(void) {
[dataForRequest:SOME_REQUEST withCallback:^(NSData *data) {
// do something with data here.
}];
});
La raison pour laquelle je fais cela sur une file d'attente série est parce que je veux que les demandes pour obtenir appelé un à la fois, en ordre dans qui ils ont été faits.
Mais le problème que je suis confronté est, les demandes sont faites dans l'ordre, mais le callbackBlock
que je passe à la méthode est pas obtenir appelé dans ordre.
Pour exemple, request_1
, request_2
et request_3
sont soumis à la file d'attente de série dans le bon ordre, mais callBackBlock_1
, callBackBlock_2
et callBackBlock_3
ne sont pas exécutées dans le même ordre.
Je comprends pourquoi cela se produit, mais je ne suis pas en mesure de trouver une solution à ce problème. Toute aide sera appréciée. Merci!
Je ne sais pas comment le faire en utilisant GCD. Mais vous pouvez utiliser NSOperationQueue où vous pouvez facilement spécifier une dépendance entre NSOperations afin que la 2ème tâche commence seulement après l'achèvement de la première tâche. –
@AlokRao Votre solution n'est pas tout à fait la même: l'idée originale était d'appeler les requêtes dans l'ordre (par exemple en utilisant une FIFO), puis de les exécuter _concurrently_. Enfin, lorsque tous sont complets, traiter les données reçues dans l'ordre. Une optimisation potentielle serait de traiter les données à leur arrivée ET si les données précédentes ont déjà été traitées.Faire cela avec NSOperation est possible, mais très lourd. Faire cela avec GCD est possible aussi - mais difficile;) – CouchDeveloper