2011-07-04 18 views
6

Necesito descargar tres conjuntos diferentes de datos de tres URL diferentes. Decidí usar ASIHTTPRequest. Dos de las URL son fuentes JSON que debo analizar y una de ellas es un archivo .txt en línea que necesito almacenar localmente.Solicitudes múltiples en ASIHTTPRequest

ahora al ejemplo que se encuentra en la página web de ASIHTTPRequest de una solicitud asincrónica muestra lo siguiente:

- (IBAction)grabURLInBackground:(id)sender { 
    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request startAsynchronous]; 
} 

Para pasar varias direcciones URL, puedo llamar a "petición" en tres direcciones URL diferentes. Pero no estoy seguro de cómo los manejaría en el método requestFinished. La documentación lo muestra como:

- (void)requestFinished:(ASIHTTPRequest *)request { 
    // Use when fetching text data 
    NSString *responseString = [request responseString]; 

    // Use when fetching binary data 
    NSData *responseData = [request responseData]; 
} 

¿Cómo diferenciaría este método entre diferentes solicitudes, para poder manejarlo de manera diferente?

Gracias,

Respuesta

12

Puede diferenciar entre diferentes peticiones por

  • establecer el diccionario userInfo de la solicitud
  • establecer el didFinishSelector (y didFailSelector etc.) para diferentes métodos
  • usando diferentes clases como delegado
  • usando bloques
  • usando propiedad de etiqueta de la solicitud
  • subclase ASIHTTPRequest y anulación de anulación requestFinished: y failWithError: (sólo recomendado para situaciones complejas)
+2

También puede usar request.tag en las versiones más recientes. – JosephH

+0

Recomiendo usar bloques. Su código será más limpio y fácil de seguir. –

+0

¿Cómo funcionan los bloques? – darksky

1

puede definir el nombre de usuario y la etiqueta de req.

este es el ejemplo de imageview. req.

UIImageView *imgV=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 416)]; 

    ASIHTTPRequest *req=[ASIHTTPRequest requestWithURL:[NSURL URLWithString:[self.arr objectAtIndex:i]]]; 
    [req setUsername:[NSString stringWithFormat:@"%i",i]]; 
    [req setUserInfo:[NSDictionary dictionaryWithObjectsAndKeys:imgV,@"imgV",nil]]; 
    [req setDelegate:self]; 
    [req startAsynchronous]; 
    [imgV setContentMode:UIViewContentModeScaleToFill]; 
    [imgV setClipsToBounds:YES]; 
    [imgV setTag:kTagImageViewInScrollView]; 
    [scr2 addSubview:imgV]; 
    [scr2 setDelegate:self]; 
    [imgV release]; imgV=nil; 

y en requestFinished

- (void)requestFinished:(ASIHTTPRequest *)request { 
    [(UIImageView*)[[request userInfo] valueForKey:@"imgV"] setImage:[UIImage imageWithData:[request responseData]]]; 

} 
+0

Esta respuesta contiene la respuesta adecuada, pero debe recortarse un poco. –

1

Usted puede comprobar la propiedad de originalUrl ASIHTTPRequest si tiene diferentes URL.

O puede usar [request hash] para obtener el hash NSObject para cada objeto y comprobarlo más tarde.

3

Solo necesita dos fragmentos de código. Uno de 'etiqueta' de su url:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
[request setUserInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"identifierX", @"typeOfRequest",nil]]; 

y otro para identificarlo:

if ([[[request userInfo] valueForKey:@"typeOfRequest"] isEqualToString:@"identifierX"]){ 
     // Do here whatever you need to do for the url associated with identifierX 
    } 

y que debe ser!

Cuestiones relacionadas