Обработка последовательных загрузок с помощью NSURLSession

У меня есть задача выборки данных, которую я хочу выполнить в фоновом потоке, но мне нужно сделать дополнительные вызовы после получения ответа в completionBlock.

Например:

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:requestURL completionHandler:completionBlock] resume];

После того, как задача успешно извлекает данные и вызывает completionBlock, я хочу загрузить, скажем, 10 дополнительных ресурсов из NSURL, которые являются частью данных, которые получает completionBlock.

Было бы лучше снова вызвать dataTaskWithURL:completionHandler: в блоке для каждого запроса или выполнить блокирующие сетевые вызовы в цикле в completionBlock?

Спасибо!


person Nirma    schedule 02.01.2015    source источник


Ответы (1)


Да, вы можете просто делать дополнительные вызовы в completionBlock. Но запросы не должны быть «блокирующими», а вы должны просто инициировать дополнительные асинхронные запросы для дополнительных данных. Вы хотите, чтобы они работали одновременно по отношению друг к другу, если ваша модель это поддерживает. Вы платите значительную потерю производительности, если отправляете эти последующие запросы последовательно, а не одновременно.

person Rob    schedule 02.01.2015
comment
Спасибо за ответ, но чтобы продолжить, если бы я пошел по указанному вами маршруту и ​​хотел, чтобы произошли определенные события, скажем, когда загружается половина ресурсов, а затем снова, когда все ресурсы загружены, я бы просто использовал этот метод с переменной счетчика, которая другие блоки Async увеличиваются по мере завершения? - person Nirma; 02.01.2015
comment
Ага. Просто убедитесь, что этот счетчик является потокобезопасным (например, отправьте логику счетчика в последовательную очередь, такую ​​как основную очередь, или используйте блокировку или блок @synchronized). - person Rob; 02.01.2015