2010-09-23 14 views
5

Actualmente tengo un controlador de vista que implementa ASIHTTP para manejar llamadas API.iPhone ASIHTTP - ¿Distinguir entre llamadas API?

Mi controlador de vista dispara 2 llamadas separadas. Necesito poder distinguir entre las 2 llamadas en el método de solicitud -requestFinished (ASIHTTPRequest *), por lo que puedo analizar cada una de ellas ...

¿Hay algo de esto?

Respuesta

9

utilizar el campo userInfo! ¡Para eso es!

Un objeto ASIHTTPRequest (o ASIFormDataRequest) tiene una propiedad llamada .userInfo que puede tomar un NSDictionary con cualquier elemento que desee. Así que casi siempre voy:

- (void) viewDidLoad { // or wherever 
    ASIHTTPRequest *req = [ASIHTTPRequest requestWithUrl:theUrl]; 
    req.delegate = self; 
    req.userInfo = [NSDictionary dictionaryWithObject:@"initialRequest" forKey:@"type"]; 
    [req startAsynchronous]; 
} 

- (void)requestFinished:(ASIHTTPRequest *)request 
{ 
    if ([[request.userInfo valueForKey:@"type"] isEqualToString:@"initialRequest"]) { 
     // I know it's my "initialRequest" .req and not some other one! 
     // In here I might parse my JSON that the server replied with, 
     // assemble image URLs, and request them, with a userInfo 
     // field containing a dictionary with @"image" for the @"type", for instance. 
    } 
} 

establecer un valor diferente para el objeto en clave @"type" en cada ASIHTTPRequest diferente que se hace en este controlador de vista, y ahora se puede distinguir entre ellos en -requestFinished: y el mango de cada uno de ellos apropiadamente .

Si es realmente elegante, puede llevar consigo cualquier otra información que sería útil cuando finalice la solicitud. Por ejemplo, si tiene imágenes de carga lenta, puede pasarle un identificador al UIImageView que desea rellenar, y luego hacerlo en -requestFinished después de que haya cargado los datos de la imagen.

1

Puede inspeccionar el parámetro request pasado a su método requestFinished:(ASIHTTPRequest *)request para diferenciar entre las dos llamadas.

Por ejemplo, si las dos llamadas tienen URL diferentes, puede inspeccionar la propiedad request.url para diferenciar entre las dos solicitudes.

0

Puede verificar las propiedades url/originalUrl O puede crear una subclase y agregar su propia propiedad para indicar la llamada de cómo lo hago porque es más fácil/más rápido comparar las entradas que las cadenas.

decir

myRequest.callType = FACEBOOK_LOGIN; 

tengo todas las llamadas en una enumeración como esto:

enum calls { 
FACEBOOK_LOGIN = 101, 
FACEBOOK_GETWALL = 102, 
... 
} 
1

Puede configurar los selectores apropiados que deben ser llamados a la creación de solicitud:

[request setDelegate: self]; 
[request setDidFailSelector: @selector(apiCallDidFail:)]; 
[request setDidFinishSelector: @selector(apiCallDidFinish:)]; 

acaba de establecer diferentes selectores para las diferentes llamadas

Cuestiones relacionadas