webentwicklung-frage-antwort-db.com.de

NSURLConnection sendAsynchronousRequest: queue: completionHandler: mehrere Anfragen hintereinander stellen?

Ich benutze NSURLConnection'ssendAsynchronousRequest:queue:completionHandler: Methode, die großartig ist. Aber ich muss jetzt mehrere Anfragen hintereinander stellen.

Wie kann ich das tun, während ich diese großartige asynchrone Methode verwende?

53
Nic Hubbard

Es gibt viele Möglichkeiten, dies abhängig vom gewünschten Verhalten zu tun.

Sie können mehrere asynchrone Anforderungen gleichzeitig senden, die Anzahl der abgeschlossenen Anforderungen verfolgen und etwas tun, wenn alle erledigt sind:

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];
        }
    }];
}

Sie könnten die Blöcke miteinander verketten:

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];

Oder Sie können alle Anforderungen synchron in einem ansynchronen Block ausführen:

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. Wenn Sie eine dieser Methoden verwenden, sollten Sie eine Fehlerprüfung hinzufügen.

108
yuji