Peut-on exécuter un bloc de complétion à partir d'AsihttpRequest / afnetworking sur un thread d'arrière-plan?

StackOverflow https://stackoverflow.com/questions/9465834

Question

Je commence mon asihttprequest de manière synchrone dans un fil séparé comme ceci:

//inside this start method I create my ASIHTTPRequest and start it
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    [process start];
});

Mais le bloc d'achèvement est toujours tiré sur le fil principal. Peut-on conserver l'exécution de la bloc de complétion dans le même fil que le démarrage de la demande?

La seule chose que je peux trouver pour résoudre ce problème est de définir une file d'attente d'expédition et d'exécuter manuellement le bloc de complétion dans le même thread, maintenant une référence à une file d'attente créée. Mais cela ne le résout pas directement parce que vous passeriez pour un petit moment effrayant dans le fil principal avant de rediriger le reste du code vers la file d'attente de répartition créée.

Quelqu'un a-t-il une meilleure solution?

EDIT: Il en va de même pour les blocs d'achèvement Afnetworking ...

Était-ce utile?

La solution

OK, pour répondre à ma propre question: AsihttpRequest Framework n'a pas d'option pour démarrer des blocs de complétion dans un fil différent.

Au lieu de cela, on peut utiliser le framework Afnetwork. Ici, vous avez deux propriétés sur tout type d'afopération appelée 'SuccessCallbackqueue' et 'FailureCallbackqueue'. Où vous pouvez ajouter un prédéfini 'dispatch_queue_t«Pour gérer l'exécution du succès et des blocs de défaillance.

J'espère que cela aidera les autres avec le même problème!

Mise à jour: exemple

 dispatch_queue_t requestQueue = dispatch_queue_create("requestQueue", NULL);
 AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:yourRequest];
 operation.successCallbackQueue = requestQueue;
 operation.failureCallbackQueue = requestQueue;
 [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    // add code for completion
 } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // add code for failure
 }];
 [operation start];

Autres conseils

Essayez d'utiliser une file d'attente définie de votre propre création. Ensuite, vous pouvez (une fois qu'il termine enfin, dans son bloc d'achèvement) signalez-vous à la file d'attente globale pour mettre à jour tout affichage nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top