2008-10-15 9 views
15

Tengo dos NSURLConnections. El segundo depende del contenido del primero, por lo que el manejo de los datos recibidos de la conexión será diferente para las dos conexiones.Delegados múltiples NSURLConnection en Objective-C

Estoy recogiendo Objective-C y me gustaría saber cuál es la forma correcta de implementar los delegados.

En este momento estoy usando:

NSURL *url=[NSURL URLWithString:feedURL]; 
NSURLRequest *urlR=[[[NSURLRequest alloc] initWithURL:url] autorelease]; 
NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:urlR delegate:self]; 

no quiero usar uno mismo como el delegado, ¿cómo definir dos conexiones con diferentes delegados?

NSURLConnection *c1 = [[NSURLConnection alloc] initWithRequest:url delegate:handle1]; 
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:handle2]; 

¿Cómo puedo crear handle1 y handle2 como implementaciones? O interfaces? Realmente no entiendo cómo harías esto.

Cualquier ayuda sería increíble.

Gracias, Brian Gianforcaro

Respuesta

4

En su muestra, que alloc un objeto sin tener que DownloadDelegate init'ing ella.

 
    DownloadDelegate *dd = [DownloadDelegate alloc]; 

Esto es peligroso. En su lugar:

 
    DownloadDelegate *dd = [[DownloadDelegate alloc] init]; 

Además, no es estrictamente necesario declarar sus métodos de respuesta de los delegados en su declaración @interface (aunque no le hará daño, por supuesto). Finalmente, querrá asegurarse de implementar la conexión: didFailWithError: y connectionDidFinishLoading: para liberar su objeto DownloadDelegate, de lo contrario, tendrá fugas.

¡Me alegra que estés en marcha!

3

delegados se implementan como objetos NSObject de ascendencia estándar.

Puede señalar ambas conexiones al mismo delegado.

El delegado debe implementar los métodos NSURLConnectionDelegate que le gustaría capturar (como -connection: didReceiveData: y -connectionDidFinishLoading :). El delegado llamará a estos métodos según corresponda.

14

Ben, mientras que su información era útil No contestó completamente la pregunta que hice.

Finalmente descubrí cómo configurar mis propios delegados, que era lo que realmente estaba preguntando.

implementé que de este modo:

@interface DownloadDelegate : NSObject 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 
@end 

@implementation DownloadDelegate 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
} 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
} 
@end 

Utilizamos el delegado de este modo:

DownloadDelegate *dd = [DownloadDelegate alloc]; 
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:dd]; 

Esperanza que ayuda a nadie en la misma posición, y gracias de nuevo Ben por su ayuda.

Gracias,

Brian Gianforcaro

+2

Gran respuesta. Exactamente lo que estaba buscando. Gracias por tomarse el tiempo para responder a su propia pregunta – Pillblast

0

dado que los delegados son llamados de forma asincrónica, pueden llamar a didfinishloading en orden aleatorio. a continuación, puede usar una comprobación de estado para determinar si la descarga "otra" ya está hecha antes de continuar.

yo uso 2 delegados:

por ejemplo (esto es pseudo-OC):

jsondelegate = [[JSonDelegate alloc]initWithCaller:self andSelector:@selector(jsonDone:)] 
otherdelegate = [[OtherDelegate] initWithCaller:self andSelector:@selector(otherDone:)] 

cuando termina cada delegado, el delegado informa a la persona que llama, llamando a los 2 métodos hecho.

cada método realizado recibe los datos de la url y guarda su estado en un ivar. luego verifican si el otro ivar está configurado y continúan procesando si ambos están terminados.

if(self.jsonString && self.otherData){ 
    continueProcessing 
} 

Espero que esto ayude.

10

Creo que la mejor manera de manejar múltiples conexiones de una manera limpia es mantener un único delegado, y simplemente identificar cada NSURLConnection con una etiqueta (que es una subclasificación muy muy simple que puede leer y copiar de http://www.isignmeout.com/multiple-nsurlconnections-viewcontroller/)

Básicamente para iniciar cada NSURLConnection con una etiqueta de identificación y luego puede extraer esa etiqueta en el delegado y usar Switch-Case para manejarla según la lógica que necesite.

ACTUALIZACIÓN

me he vuelto el NSURLConnection subclase en una simple categoría - un poco más simple y más limpio

https://github.com/Shein/Categories