49 votes

Comment faire une demande en lot avec AFNetworking 2?

Je suis donc la réécriture d'une application pour iOS 7 avec AFNetworking 2.0 et je suis en cours d'exécution dans la question de l'envoi d'un lot de requêtes à la fois et le suivi de leurs progrès. Dans l'ancien AFNetworking, il y avait l' enqueueBatchOfHTTPRequestOperations:progressBlock:completionBlock: méthode AFHTTPClient, c'est clairement refait et je suis un peu confus sur la façon de mettre en file d'attente des demandes multiples.

J'ai créé une sous-classe de AFHTTPSessionManager et je suis à l'aide de l' POST:... et GET:... méthodes pour communiquer avec le serveur. Mais je ne peux pas trouver quelque chose dans le code et/ou des documents à mettre en file d'attente plusieurs demandes à la fois, comme avec le vieux - AFHTTPClient.

La seule chose que je trouve, c'est les sans-papiers, batchOfRequestOperations:progressBlock:completionBlock: méthode AFURLConnectionOperation, mais qui ressemble à l'iOS 6 manière de faire.

Il est clair que je suis absent quelque chose dans le nouveau NSURLSession concept que je devrais utiliser pour des demandes de lots ou à la recherche d'un nouveau AFNetworking fonctionnalité. J'espère que quelqu'un peut m'aider sur la bonne voie!

tl;dr: Comment puis-je envoyer un lot de demandes avec mon AFHTTPSessionManager sous-classe?

85voto

Mac_Cain13 Points 2002

Grâce Sendoa pour le lien vers le GitHub d'un problème où les Mattt explique pourquoi cette fonctionnalité ne fonctionne plus. Il est clair raison pour laquelle ce n'est pas possible avec le nouveau NSURLSession de la structure, les Tâches ne sont pas seulement des opérations, de sorte que la vieille manière de l'utilisation des dépendances ou des lots d'exploitation ne fonctionne pas.

J'ai créé cette solution à l'aide d'un dispatch_group qui permet à des demandes de lots à l'aide de NSURLSession, voici le (pseudo-)code:

// Create a dispatch group
dispatch_group_t group = dispatch_group_create();

for (int i = 0; i < 10; i++) {
    // Enter the group for each request we create
    dispatch_group_enter(group);

    // Fire the request
    [self GET:@"endpoint.json"
       parameters:nil
          success:^(NSURLSessionDataTask *task, id responseObject) {
                  // Leave the group as soon as the request succeeded
                  dispatch_group_leave(group);
          }
      failure:^(NSURLSessionDataTask *task, NSError *error) {
                  // Leave the group as soon as the request failed
                  dispatch_group_leave(group);
              }];
}

// Here we wait for all the requests to finish
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    // Do whatever you need to do when all requests are finished
});

Je veux regarder écrire quelque chose qui rend cela plus facile à faire et à discuter avec Matt si c'est quelque chose (lors de la mise en œuvre gentiment) qui pourraient être fusionnés en AFNetworking. À mon avis, il serait bien de faire quelque chose comme ceci avec la bibliothèque elle-même. Mais je dois vérifier quand j'aurai un peu de temps pour cela.

1voto

Ruenzuo Points 340

Sur AFNetworking 2.0, AFHTTPClient a été fractionné sur AFHTTPRequestOperationManager et AFHTTPSessionManager , vous pouvez donc commencer par le premier, qui possède operationQueue propriétés. .

1voto

Sendoa Points 942

Actuellement, les tâches NSURLSession ne sont pas adaptées au même type d'opérations de demande de modèle utilisées. Voir la réponse de Mattt Thompson ici sur cette question.

Réponse directe: si vous avez besoin de dépendances ou de lots, vous devez toujours utiliser les opérations de requête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X