Я запускаю 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, когда оно снова становится активным. Это обходной путь, который хорош, но не идеален, поскольку загрузка не происходит в фоновом режиме, что отрицательно влияет на работу пользователя ... облом.