В конечном итоге устройство, на котором вы выполняете код, имеет один процессор и не может загружать большие объемы (гигабайты) данных. Вероятно, лучший маршрут по предложенному Беном (NSURLConnection асинхронно) дает вам дополнительное преимущество, заключающееся в возможности чистой отмены и обработки сообщений об ошибках. Хотя технически это не связано с тем, как вы, вероятно, думаете, оно должно быть, оно хорошо интегрировано в цикл обработки событий и не блокирует. Если этого все еще недостаточно, я бы посоветовал взглянуть на NSOperation и NSOperationQueue. Вы можете запустить объект подкласса NSOperation и выполнить загрузку там (я все же рекомендовал бы делать это асинхронно там, чтобы включить отмену, приостановку и т. Д.).