Асинхронное NSURLConnection с NSOperation
Я хочу делать NSURLConnection
в фоновом режиме, потому что это ответ имеет много данных. Форматы говорят использовать конечную длину кодирования Apple для использования в didEnterBackground
, но я хочу избежать этого. Вместо этого я использую следующий код через NSOperation
с NSInvocation
как, но это не работает.connectToServer
имеет NSURLConnection
операция. любая помощь, пожалуйста?didReceiveData
,didReceiveResponse
методы делегата не вызываются?
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(connectToServer)
object:nil];
[queue addOperation:operation];
[operation release];
[queue autorelease];
-(void)connectToServer
{
NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSURLConnection *theConnection = [[[NSURLConnection alloc] initWithRequest:theRequest delegate:self] autorelease];
if( theConnection )
{
webData = [[NSMutableData data] retain];
}
else
{
NSLog(@"theConnection is NULL");
}
}
3 ответа
Такого рода вопрос задавался миллионы раз. Делегатов не вызывают, потому что с iOS 4 операции запускаются во вторичном потоке. Поток, вероятно, завершается до вызова делегатов, вот и все.
Сохраняйте соединение в главном потоке и обрабатывайте данные в фоновом потоке с помощью GCD.
Я написал обо всем этом здесь: http://cocoaintheshell.com/2011/04/nsurlconnection-synchronous-asynchronous/
РЕДАКТИРОВАТЬ: Обновленная ссылка.
Apple предоставляет QHTTPOperation
, который делает то, что вы хотите, инкапсулирует NSURLConnection
в пределах NSOperation
, для одного запроса. Вы можете найти его в примере кода Apple.
QHTTPOperation
на самом деле подкласс QRunLoopOperation
которая позволяет вам инкапсулировать логику, которая зависит от обратных вызовов цикла выполнения в NSOperation.
3-я сторона ASIHTTPRequest
Подобное популярное решение, AFAIK, оно больше не поддерживается.