Асинхронное соединение NSURLConnection в отдельном потоке не может вызвать методы делегата

Я запускаю NSURLConnection в отдельном потоке (я знаю, что он асинхронный и работает при запуске в основном потоке), но он не вызывает вызовов делегатов, даже когда я передаю родительский поток в качестве делегата. Кто-нибудь знает, как это сделать?

Код:

-(void)startConnectionWithUrlPath:(NSString*)URLpath {

//initiates the download connection - setup
NSURL *myURL = [[NSURL alloc] initWithString:URLpath];

myURLRequest = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
[myURL release];


//initiates the download connection on a seperate thread
[NSThread detachNewThreadSelector:@selector(startDownloading:) toTarget:self withObject:self];

}


-(void)startDownloading:(id)parentThread {

 NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];

 [NSURLConnection connectionWithRequest:myURLRequest delegate:parentThread];
 //The delegate methods are setup in the rest of the class but they are never getting called...

 [pool drain];
}

РЕДАКТИРОВАТЬ *

Причина, по которой мне нужно запускать NSURLConnection в отдельном потоке, заключается в том, что я загружаю что-то в своем приложении для iPhone, и загрузка прекращается, когда пользователь блокирует экран (он продолжает работать нормально, если пользователь просто нажимает кнопку «Домой», и приложение переходит в фоновый режим). Я понимаю, что это связано с тем, что я запускаю соединение асинхронно в основном потоке, а не в отдельном.

Я также пробовал этот код (НЕ в отдельном потоке) при запуске NSURLConnection:

  NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:myURLRequest delegate:self startImmediately:NO];
   [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
   [connection start];
   [connection release];

Но у меня такая же проблема с этим, что касается отмены загрузки при блокировке экрана.

* ОБНОВЛЕНИЕ

Чтобы добавить к ответу Томаса ниже (обратите внимание, что ответ Джеймса Вебстера также верен в отношении выхода из потока), документы Apple объясняют: «Приостановленное состояние - приложение находится в фоновом режиме, но не выполняет код. Система переводит приложения в это состояние автоматически и не уведомляет их перед этим. В приостановленном состоянии приложение остается в памяти, но не выполняет никакого кода."

Поскольку, когда экран заблокирован пользователем, приложение переводится в фоновое состояние, а затем сразу в состояние приостановки, все выполнение останавливается, уничтожая все загрузки, и не выдается никакого предупреждения о том, что это вот-вот произойдет .. . может появиться уведомление о том, что пользователь заблокировал экран, но я его еще не нашел.

Поэтому я приостанавливаю (сохраняю определенную информацию и отменяю NSURLConnection) все загрузки, когда приложение переходит в фоновый режим и возобновите его с помощью заголовка HTTP Range, когда он снова станет активным. Это обходной путь, который хорош, но не идеален, поскольку загрузка не происходит в фоновом режиме, что отрицательно влияет на работу пользователя ... облом.

6
задан pb2q 7 June 2012 в 09:37
поделиться