Асинхронное 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, оно больше не поддерживается.

Посмотрите на sendAsynchronousRequest:queue:completeHandler: метод, описанный здесь в документации Apple. Это позволяет асинхронные запросы с NSURLConnection.

Обратите внимание, что это требует iOS5 или выше

Другие вопросы по тегам