2009-09-12 8 views

Respuesta

12

Guarde ambos objetos NSURLConnection como variables miembro de cualquier objeto delegado que haya pasado a connectionWithRequest: delegate :. A continuación, sólo se puede comparar cada uno de los al NSURLConnection pasado a connectionDidFinishLoading :, y responder de manera apropiada:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    if (connection == firstConnection) { 
     // do something 
    } 
    else if (connection == secondConnection) { 
     // do something else 
    } 
} 

Otra opción un poco más orientado a objetos sería la creación de dos objetos diferentes delegados, cada uno de ellos sabe cómo tratar con cada tipo de conexión Luego solo pase el delegado apropiado cuando cree cada conexión. De esta forma, no necesita verificar para ver qué conexión tiene, ya que cada delegado solo recibirá connectionDidFinishLoading: para su propia conexión.

+3

Esto no es una solución muy escalable – coneybeare

+0

No tan escalable, pero buena solución, solucionó mi problema. Gracias. – Krishna

+0

@cduhn es posible subclasificar NSURLConnection y darle una propiedad de ID como NSString, por ejemplo. De esta forma, si tiene un número indefinido de objetos que pueden necesitar conexión (por ejemplo, aceptar una lista de solicitudes de amistad), todo lo que tiene que hacer es configurar su ID de CustomNSURLconection para que tenga el mismo valor que el que identifica de manera única su objeto por ejemplo, ID de usuario? De esta manera, no debe tener una instancia de cientos de NSURLconnections. No puedo probar esto en este momento, es por eso que pregunto aquí – pnizzle

1

Lo que hago en mis proyectos es crear una clase contenedora para la conexión. De esta manera, puede mantener una nueva instancia para cada conexión que necesita y mantener estas clases en otra clase de administrador.

Algo así como [AsynchronousConnection initWithURL: delegado: Selector:]

entonces puede estar asegurar lo correcto se llama cuando se hace el NSURLConnection/fallidos.

2

Prefiero delegados diferentes para cada conexión, también. Aunque es un poco caro. Afortunadamente, puedes simplificar las cosas usando bloques. Es una característica nueva que aún no existe en SDK estándar, pero hay 3rd-party framework called PLBlocks que ya puede usar. Here is an article sobre cómo usarlos, también contiene un ejemplo para NSURLConnection.

Este es el código de cliente que realiza la solicitud HTTP con el bloque de devolución de llamada:

NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]]; 
[NSURLConnection sendAsynchronousRequest:req onCompletionDo: ^(NSData *data, NSURLResponse *res, NSError *err) { 
    NSLog(@"data: %ld bytes. res: %@, error: %@", (long)[data length], res, err); 
    [cell.activity stopAnimating]; 
}]; 
1

he utilizado para crear una envoltura alrededor de encargo NSURLConnection, también, pero ahora he cambiado a ASIHTTPRequest. Esta es una fantástica biblioteca que ofrece mucha más flexibilidad y funciones que NSURLConnection. Echa un vistazo y pruébalo, realmente vale la pena.

+0

Uso esto también, pero tengo un contenedor alrededor de este – coneybeare

+0

Solía ​​utilizar ASIHTTPRequest como bien, pero lamentablemente desde septiembre de 2011 ya no es compatible con su autor: http://allseeing-i.com/%5Brequest_release%5D –

+1

@DanJ: una alternativa muy popular en estos días parece ser [AFNetworking] (https://github.com/AFNetworking/AFNetworking/). –

0

Por favor, no se refieren https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

ir al archivo NSURLConnection.h y encontrará lo siguiente.

Cuando se crea, un NSURLConnection realiza una copia en profundidad de NSURLRequest. Esta copia está disponible a través del método -originalRequest . A medida que la conexión realiza la carga, esta solicitud puede cambiar como resultado de la canonicalización del protocolo o debido a los siguientes redireccionamientos . -currentRequest se puede usar para recuperar este valor.

En definitiva [connection currentRequest] .URL absoluteURL might help.

Saludos, PRASANNA.

+0

Prasanna ¿qué significa eso? – Ranjit

Cuestiones relacionadas