Я бы настроил NSOperationQueue с одной операцией на URL и установил бы, скажем, три одновременных операции.Затем используйте не асинхронный API NSURLConnection для выполнения загрузки.
Для вашего индикатора выполнения, вероятно, достаточно будет обновить прогресс после завершения каждого отдельного файла и выполнять два из них одновременно (или что-то еще),Скорее всего, задержка будет больше, чем половина «прогресса» в любом случае, поэтому, если вы не начнете пытаться предсказать время пинга, индикатор выполнения, основанный на фактически переданных байтах, будет недостаточно точным (если это не очень большие изображения).
Вам нужно будет узнать, как работают очереди операций и GCD, но как только вы их отсортируете, кода вообще не будет много, и он будет очень надежным.
По сути, вы хотите добавить «блок» кода в очередь операций для каждого загружаемого URL-адреса, и очередь выяснит, как загрузить каждый из них, а затем, когда каждый отдельный блок кода будет завершен, он выполнит другой блок на главном.поток (dispatch_sync(dispatch_get_main_queue(), ^{ ... })
) для обновления индикатора выполнения.