53 votes

NSURLConnection sendAsynchronousRequest: queue: completionHandler: effectuer plusieurs demandes à la suite?

J'ai utilisé NSURLConnection's sendAsynchronousRequest:queue:completionHandler: méthode, ce qui est génial. Mais, je dois maintenant faire plusieurs demandes d'affilée.

Comment puis-je faire cela tout en utilisant cette méthode asychrone?

108voto

yuji Points 11531

Il ya beaucoup de façons dont vous pouvez faire cela en fonction sur le comportement que vous souhaitez.

Vous pouvez envoyer un tas de requêtes asynchrones à la fois, de suivre le nombre de demandes qui ont été complétés, et de faire quelque chose une fois qu'ils sont tous fait:

NSInteger outstandingRequests = [requestsArray count];
for (NSURLRequest *request in requestsArray) {
    [NSURLConnection sendAsynchronousRequest:request 
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        [self doSomethingWithData:data];
        outstandingRequests--;
        if (outstandingRequests == 0) {
            [self doSomethingElse];
        }
    }];
}

Vous pourriez enchaîner les blocs ensemble:

NSMutableArray *dataArray = [NSMutableArray array];    
__block (^handler)(NSURLResponse *response, NSData *data, NSError *error);

NSInteger currentRequestIndex = 0;
handler = ^{
    [dataArray addObject:data];
    currentRequestIndex++;
    if (currentRequestIndex < [requestsArray count]) {
        [NSURLConnection sendAsynchronousRequest:[requestsArray objectAtIndex:currentRequestIndex] 
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:handler];
    } else {
        [self doSomethingElse];
    }
};
[NSURLConnection sendAsynchronousRequest:[requestsArray objectAtIndex:0] 
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:handler];

Ou vous pourriez faire toutes les demandes de manière synchrone dans un ansynchronous bloc:

dispatch_queue_t callerQueue = dispatch_get_current_queue();
dispatch_queue_t downloadQueue = dispatch_queue_create("Lots of requests", NULL);
    dispatch_async(downloadQueue, ^{
        for (NSRURLRequest *request in requestsArray) {
            [dataArray addObject:[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]];
        }
        dispatch_async(callerQueue, ^{
            [self doSomethingWithDataArray:dataArray];
        });
    });
});

P. S. Si vous utilisez l'un de ces, vous devez ajouter un peu de vérification des erreurs.

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