Асинхронное NSURLConnection с NSOperation - PullRequest
14 голосов
/ 10 февраля 2012

Я хочу сделать 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 ]

42 голосов
/ 13 февраля 2012

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

Сохраняйте соединение в главном потоке и обрабатывайте данные в фоновом потоке с помощью GCD.

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

РЕДАКТИРОВАТЬ: Обновленная ссылка.

6 голосов
/ 20 февраля 2012

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

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

Стороннее ASIHTTPRequest является аналогичным популярным решением, AFAIK, однако, больше не поддерживается.

0 голосов
/ 10 февраля 2012

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

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

...