2012-02-10 17 views
14

Quiero hacer NSURLConnection en modo de fondo, porque su respuesta está teniendo mucha información. Los foros dicen que usar la codificación de longitud finita de Apple para usar en didEnterBackground. pero quiero evitarlo. En lugar de usar el siguiente código a través de NSOperation con NSInvocation como, pero no está funcionando. connectToServer está teniendo NSURLConnection operation.any help por favor? didReceiveData, didReceiveResponse ¿no se llaman los métodos de delegado?NSURLConnection asincrónico con NSOperation

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"); 
    } 
} 
+0

Tu pregunta no es clara –

+0

por favor ver mi pregunta editada? – nameless

Respuesta

42

Este tipo de pregunta se hizo un tiempo de trillón. Los delegados no son llamados porque a partir de iOS 4 las operaciones se inician en un hilo secundario. El hilo probablemente se cierra antes de llamar a los delegados, eso es todo.

Mantenga la conexión en la rosca principal y maneje los datos en una rosca de fondo usando GCD.

Me'v escribió sobre todo esto aquí: http://cocoaintheshell.com/2011/04/nsurlconnection-synchronous-asynchronous/

EDIT: Actualización enlace.

+2

disfruta de mi 50 votos ganados. Debería haber respondido antes de mi recompensa :) – nameless

+0

¿puedes por favor decirme cómo detener Runloop y el puerto? – nameless

+5

[runLoop removePort: PORT forMode: MODE]; CFRunLoopStop (CFRunLoopGetCurrent()); – Nyx0uf

0

Mira el sendAsynchronousRequest: cola: completionHandler: método documentado here in Apple's Documentation. Permite solicitudes asincrónicas con NSURLConnection.

Nota esto requiere iOS5 o superior

+0

espero que sea solo para MAC – nameless

+0

El primer enlace que tenía era para Mac, lo he actualizado para la versión de iOS. ¿Quieres la referencia de Mac? La documentación de Mac se puede encontrar aquí: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/doc/uid/20001697- DontLinkElementID_1 –

+0

que quiero hacer en iOS4 ... por favor responda a mi pregunta ¿por qué no está funcionando? – nameless

6

Apple proporciona QHTTPOperation, que hace justo lo que desea, encapsula un NSURLConnection dentro de un NSOperation, para una sola solicitud. Puede encontrarlo en Apple's sample code.

QHTTPOperation es en realidad una subclase de QRunLoopOperation que le permite encapsular la lógica que depende de las devoluciones de llamada en bucle en un NSOperation.

La tercera parte ASIHTTPRequest es una solución popular similar, AFAIK ya no se mantiene.

Cuestiones relacionadas