programing

NSURLConnection sendAsynchronousRequest : queue : completionHandler : 연속으로 여러 요청을 생성합니까?

goodcopy 2021. 1. 19. 08:02
반응형

NSURLConnection sendAsynchronousRequest : queue : completionHandler : 연속으로 여러 요청을 생성합니까?


나는 NSURLConnection's sendAsynchronousRequest:queue:completionHandler:훌륭한 방법을 사용하고 있습니다. 하지만 이제 여러 요청을 연속해서 만들어야합니다.

이 훌륭한 비동기 방법을 사용하면서 어떻게 할 수 있습니까?


원하는 동작에 따라이를 수행 할 수있는 많은 방법이 있습니다.

한 번에 많은 비동기 요청을 보내고 완료된 요청 수를 추적하고 모두 완료되면 작업을 수행 할 수 있습니다.

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

블록을 함께 연결할 수 있습니다.

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

또는 비동기 블록에서 모든 요청을 동기식으로 수행 할 수 있습니다.

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

추신이 중 하나를 사용하는 경우 오류 검사를 추가해야합니다.

참조 URL : https://stackoverflow.com/questions/9409211/nsurlconnection-sendasynchronousrequestqueuecompletionhandler-making-multiple

반응형