2011-07-04 3 views
6

Je dois télécharger trois ensembles de données différents à partir de trois URL différentes. J'ai décidé d'utiliser ASIHTTPRequest. Deux des URL sont des flux JSON dont j'ai besoin d'analyser et l'un d'eux est un fichier .txt en ligne que je dois stocker localement.Demandes multiples sur ASIHTTPRequest

maintenant l'exemple qui est sur le site Web de ASIHTTPRequest pour une requête asynchrone affiche les informations suivantes:

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

Pour passer plusieurs URL, je peux appeler « demande » sur trois URL différentes. Mais je ne suis pas sûr de savoir comment je les manipulerais dans la méthode requestFinished. La documentation le montre comme:

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

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

Comment cette méthode différencierait-elle les différentes demandes, pour que je puisse la gérer différemment?

Merci,

Répondre

12

Vous pouvez différencier entre les différentes demandes par

  • réglage le dictionnaire userInfo de la demande
  • réglage de la didFinishSelector (et didFailSelector etc.) à différentes méthodes
  • utilisant différentes classes en tant que délégué
  • à l'aide de blocs
  • à l'aide tag propriété
  • sous-classe ASIHTTPRequest et remplacement de priorité de la demande requestFinished: et failWithError: (seulement recommandé pour les situations complexes)
+2

Vous pouvez également utiliser request.tag dans les versions les plus récentes. – JosephH

+0

Je recommande fortement d'utiliser des blocs. Votre code sera plus propre et facile à suivre. –

+0

Comment fonctionnent les blocs? – darksky

1

vous pouvez définir le nom d'utilisateur et une étiquette de req.

Ceci est l'exemple de l'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; 

et requestFinished

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

} 
+0

Cette réponse contient la réponse correcte, mais devrait être rognée un peu. –

1

Vous pouvez vérifier la propriété originalURL de ASIHTTPRequest si vous avez différents URLS.

Ou vous pouvez utiliser [hachage de la demande] pour obtenir le hachage NSObject pour chaque objet et vérifier plus tard.

3

Vous avez juste besoin de deux extraits de code. One to 'tag' URL:

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

et un autre pour l'identifier:

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

et qui devrait être elle!