6

Estoy ejecutando un NSURLConnection en un hilo separado (soy consciente de que es asincrónico y funciona cuando se ejecuta en el hilo principal), pero no hace llamadas delegadas incluso cuando pasar el hilo padre como el delegado. ¿Alguien sabe como hacer esto?NSURLCincronización asincrónica en un hilo separado no puede llamar a los métodos de delegado

Código:

-(void)startConnectionWithUrlPath:(NSString*)URLpath { 

//initiates the download connection - setup 
NSURL *myURL = [[NSURL alloc] initWithString:URLpath]; 

myURLRequest = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 
[myURL release]; 


//initiates the download connection on a seperate thread 
[NSThread detachNewThreadSelector:@selector(startDownloading:) toTarget:self withObject:self]; 

} 


-(void)startDownloading:(id)parentThread { 

NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init]; 

[NSURLConnection connectionWithRequest:myURLRequest delegate:parentThread]; 
//The delegate methods are setup in the rest of the class but they are never getting called... 

[pool drain]; 
} 

EDITAR *

La razón por la que se necesita para ejecutar NSURLConnection en un hilo separado se debe a que estoy descargando algo en mi aplicación para el iPhone y la descarga se cancela cuando el el usuario bloquea la pantalla (continúa bien si el usuario simplemente presiona el botón de inicio y la aplicación entra en segundo plano). Entiendo que esto se debe a que estoy ejecutando la conexión de forma asíncrona en el hilo principal y no en uno separado.

También he probado este código (no en un hilo separado) al iniciar la NSURLConnection:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:myURLRequest delegate:self startImmediately:NO]; 
    [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [connection start]; 
    [connection release]; 

Pero tengo el mismo problema con esto con respecto a la descarga de ser cancelada en el bloqueo de la pantalla.

* ACTUALIZACIÓN

Para añadir a la respuesta de Thomas continuación (Tenga en cuenta que la respuesta de James Webster también es correcto con respecto a la excitante de un hilo) la documentación de Apple explican: "estado suspendido - La aplicación está en el fondo pero no está ejecutando el código. El sistema mueve las aplicaciones a este estado automáticamente y no las notifica antes de hacerlo. Mientras se suspende, una aplicación permanece en la memoria pero no ejecuta ningún código ".

Dado que cuando la pantalla está bloqueada por el usuario la aplicación se pone en el estado de fondo y de inmediato en el estado suspendido, se detiene la ejecución y se da ninguna descarga que advierta que va a suceder. . Puede haber una notificación que me dice que el usuario ha bloqueado la pantalla, pero todavía no he encontrado ninguna.

Por lo tanto, pause (guarde cierta información y cancele el NSURLConnection) todas las descargas cuando la aplicación pasa a segundo plano y la reanuda con el encabezado del rango HTTP cuando se vuelve a activar. Esta es una solución que está bien, pero no es ideal, ya que la descarga no se produce en segundo plano, lo que afecta negativamente la experiencia del usuario ... fastidio.

+0

los métodos que está utilizando para la solicitud de NSURLConnection son asíncronos por lo tanto, incluso si no separa el nuevo hilo, será una operación multiproceso. – Ravin

+0

Pregunta editada para explicar mejor mi problema. – Zigglzworth

Respuesta

1

Desde su NSURLConnection es asíncrona, al final de su método -startDownloading se alcanza de inmediato, y el hilo sale.

Debería programar su conexión en el runloop principal (o usar GCD).

El bloqueo del dispositivo es otro problema. Cuando el dispositivo está bloqueado, su aplicación se suspende para ahorrar batería. Probablemente pueda pedir an extra amount of time when suspending para finalizar su descarga.

+0

Gracias. Actualicé mi pregunta para construir sobre su respuesta. Parece que pedir más tiempo es solo para aplicaciones en segundo plano y no para aquellas que están suspendidas. – Zigglzworth

0

Creo que su problema podría ser que el NSURLConnection ha sido desasignado tan pronto como salga el mensaje startDownloading: (o más exactamente cuando se drena su piscina autorelease)

Sin embargo creo que su metodología podría ser un poco grosero de todos modos . NSURLConnection la forma en que lo está utilizando es asíncrona y aparecerá enhebrada de todos modos.

probar esto y ver si funciona como se espera a (es decir, su aplicación no se detenga, mientras que la conexión está ocupada)

-(void)startConnectionWithUrlPath:(NSString*)URLpath { 

    //initiates the download connection - setup 
    NSURL *myURL = [[NSURL alloc] initWithString:URLpath]; 

    myURLRequest = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 
    [myURL release]; 

    [NSURLConnection connectionWithRequest:myURLRequest delegate:self]; 
} 
+0

Pregunta editada para explicar mejor mi problema. – Zigglzworth

+0

Ok, tu edición tiene sentido. Presta atención a la primera parte de mi respuesta. Parece que su NSURLConnection ha sido desasignada casi de inmediato. –

+0

Esta respuesta se ha mencionado también como correcta en mi actualización de la pregunta. – Zigglzworth

Cuestiones relacionadas