Delegado de NSURLConnection – Determinar qué function o connection desencadenó el delegado

Posible duplicado:
Gestión de dos NSURLConnection
NSURLConnection delegate

Tengo dos methods diferentes que llaman diferentes conexiones NSURLC;

Método A

NSURLConnection *serverConnection = [[NSURLConnection alloc]initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:addressOfSideWebService]] delegate:self]; 

Método B

 NSURLConnection *serverConnection = [[NSURLConnection alloc]initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:addressOfMainWebService]] delegate:self]; 

El problema es que estas dos NSURLConnections desencadenan los mismos delegates;

 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [self.serverData appendData:data]; } -(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *response = [[NSString alloc]initWithData:self.serverData encoding:NSUTF8StringEncoding]; // use data } 

Lo que quiero saber es que podemos labelr NSURLConnections 'o método llamado NSURLConnection, con el fin de identificar qué function o método para que pueda actuar sobre él.

¿Podemos establecer diferentes delegates, o hay alguna otra metodología que debería seguir?

Espero ser claro, cualquier otra información puede ser proporcionada. Gracias.

Por qué no configurar properties como:

 NSURLConnection *serverConnection1; NSURLConnection *serverConnection2; 

Luego usa como:

 serverConnection1 = [[NSURLConnection alloc]initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:addressOfSideWebService]] delegate:self]; 

Luego, en sus methods de delegado, verifique qué connection es:

 if (connection == serverConnection1) { //Do stuff } else if (connection == serverConnection2) { //Do other stuff } 

Su código existente está utilizando 'self' como delegado para ambas llamadas, que es la raíz de su problema.

En mi humilde opinión, la mejor manera de manejar esto es crear classs separadas para cada controller de respuestas. Esto ayuda a mantener limpio su código. Esas classs deben ser NSURLConnectionDelegates que contienen su código de event handling respuesta.

Cuando cree su NSURLConnection de la class que llama, asegúrese de establecer el delegado correcto en la creación.

Ahora cada una de sus NSURLConnections volverá a llamar a su class designada cuando termine.

Entonces, su class de llamada podría verse algo como esto:

 #import "FeedDownloader.h" #import "URLConnectionResponseScenarioADelegate.h" @implementation FeedDownloader - (id)init { URLConnectionResponseScenarioADelegate *connectionDelegate = [[URLConnectionResponseScenarioADelegate alloc] init]; NSURLConnection *myConnection = [[NSURLConnection alloc] initWithRequest:[[NSURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"http://www.apple.com"]] delegate:connectionDelegate]; [myConnection start]; return self; } @end 

Tu class de manejador de respuestas podría parecer algo como esto:

 #import "URLConnectionResponseScenarioADelegate.h" @implementation URLConnectionResponseScenarioADelegate @synthesize data; #pragma mark NSURLConnection delegate methods // The following are delegate methods for NSURLConnection. Similar to callback functions, this is how the connection object, // which is working in the background, can asynchronously communicate back to its delegate on the thread from which it was // started - in this case, the main thread. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { self.data = [NSMutableData data]; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)_data { [self.data appendData:_data]; } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { } @end 

Radesix sugirió un buen método, pero puede ser un poco exagerado. Una manera fácil de solucionarlo es almacenar cada NSURLConncection en un ivar separado y solo verificar la igualdad de puntero en los methods de delegado.

 self.serverConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { if(connection == self.serverConnection) { //Do A } else { //Do B } }