Просто используйте ASIHTTPRequest , это намного проще, чем NSURLRequest и делает именно то, что вам нужно.
Это примеров , показывающих, как загружать в фоновом режиме и как сообщать о прогрессе.
Я бы не стал ничего загружать в AppDelegate напрямую. Вместо этого я бы создал отдельный класс только для этой цели. Давайте назовем это MyService
Я бы затем инициализировал этот класс в моем делегате приложения.
Класс может работать как одноэлементный или может передаваться каждому контроллеру представления, которому это требуется.
В MyService
классе я бы добавил ASINetworkQueue и несколько методов для обработки запросов, когда они будут готовы. Вот код из примеров ASI, который вы можете использовать:
- (IBAction)startBackgroundDownloading:(id)sender
{
if (!self.queue) {
self.queue = [[[ASINetworkQueue alloc] init] autorelease];
}
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];
[self.queue addOperation:request]; //queue is an NSOperationQueue
[self.queue go];
}
- (void)requestDone:(ASIHTTPRequest *)request
{
NSString *response = [request responseString];
//Do something useful with the content of that request.
}
- (void)requestWentWrong:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}
Если вам нужно установить индикатор выполнения. Я бы просто выставил setDownloadProgressDelegate ASINetworkQueue в моем классе MyService и установил его в моих ViewControllers следующим образом:
[[MyService service] setDownloadProgressDelegate: self.myUIProgressView];
КСТАТИ. Если вам нужно продолжить загрузку даже после выхода из приложения, вы можете установить для свойства ShouldContinueWhenAppEntersBackground
вашего запроса значение YES.