Асинхронное NSURLConnection с NSOperation

Я хочу сделать NSURLConnection в фоновом режиме, потому что у него есть много данных. Forums говорят использовать кодировку конечной длины Apple для использования в didEnterBackground. но я хочу избежать этого. Вместо этого я использую следующий код через NSOperation с NSInvocation как, но он не работает. connectToServer имеет NSURLConnection operation.any help please? 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");
    }
}

Ответ 1

Этот вопрос был задан на миллион раз. Делегаты не получают вызов, потому что с iOS 4 операции запускаются во вторичном потоке. Поток, вероятно, выйдет до того, как делегаты будут вызваны всем.

Держите соединение в основном потоке и обрабатывайте данные в фоновом потоке с помощью GCD.

Здесь я написал обо всем этом: http://cocoaintheshell.com/2011/04/nsurlconnection-synchronous-asynchronous/

EDIT: обновленная ссылка.

Ответ 2

Apple предоставляет QHTTPOperation, который делает именно то, что вы хотите, инкапсулирует NSURLConnection в NSOperation для одного запроса. Вы можете найти его в Apple пример кода.

QHTTPOperation фактически является подклассом QRunLoopOperation, который позволяет инкапсулировать логику, которая зависит от обратных вызовов run-loop в NSOperation.

Третья сторона ASIHTTPRequest - это аналогичное популярное решение, AFAIK уже не поддерживается.

Ответ 3

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

Примечание. Для этого требуется iOS5 или выше