Обработка нескольких асинхронных запросов iOS: отправьте сигнал, когда все запросы завершены - PullRequest
6 голосов
/ 20 сентября 2011

Итак, я просматриваю Stack Overflow, чтобы узнать, как эффективно обрабатывать асинхронные запросы. Прямо сейчас я использую ASIHTTPRequest, и мое приложение использует REST API, в котором запрос к одному ресурсу побуждает меня запросить 5 или более дополнительных ресурсов (связанных ресурсов).

Сейчас я делаю все асинхронные запросы внутри одного огромного метода, может быть около 6 асинхронных запросов, каждый с их setCompletionBlock и setFailBlock. Если вы использовали ASIHTTPRequest, у вас должно быть представление о том, сколько повторяющегося кода потребуется.

В любом случае, я, кажется, нашел решение, чтобы определить, завершены ли все запросы с этим ответом: Несколько асинхронных URL-запросов

однако я не знаю, как применить этот ответ в коде, так как раньше я не использовал push-уведомления и всегда использовал «self» в качестве делегатов, а не других классов.

Есть идеи, как я могу применить ответ к коду или, что еще лучше, знаете ли вы какие-либо другие методы?

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 20 сентября 2011

Поместите все запросы в ASINetworkQueue: http://allseeing -i.com / ASIHTTPRequest / Как использовать # about_ASINetworkQueues .

ASINetworkQueue имеет обратный вызов, называемый queueDidFinishSelector.

3 голосов
/ 20 сентября 2011

Использование группы GCD с dispatch_group_wait.

Пример:

__block NSMutableArray *imageURLList = [NSMutableArray array];

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

for (Helper *siteURL in list) {
    dispatch_group_async(group, queue, ^{
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:siteURL]];
        NSURLResponse *response;
        NSError *error;
        NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        if (urlData.length)
            [imageURLList urlData];
    });
}

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

Обратите внимание, что блок выполняется асинхронно, поэтому можно использовать sendSynchronousRequest:.

...