2010-08-17 7 views
1

J'ai une instance de ASINetworkQueue et j'ai ajouté des instances de ASIHTTPRequest à la file d'attente; Pendant ce temps, j'ai des méthodes de délégués définis pour la file d'attente, ainsi que chaque demande:ASIHTTPRequest: Erreur lors de la tentative d'invocation de la méthode déléguée

[submittingReportQueue setDelegate:self]; 
[submittingReportQueue setRequestDidFailSelector:@selector(submitReportQueueWentWrong:)]; 
[submittingReportQueue setQueueDidFinishSelector:@selector(submitReportQueueFinished:)]; 

et dans une boucle I ajouté à la file d'attente demande, ajouter appel [submittingReportQueue aller] en dehors de la boucle.

ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:url] autorelease]; 
NSString *auth = [[AuthenticationManager sharedInstance] authenticationHeaderValue]; 
request addRequestHeader:@"Authorization" value:auth]; 
[request addRequestHeader:@"Content-Type" value:@"application/json"]; 
NSString *jsonString =[self jsonStringForExpenseReport:report]; 
[request appendPostData:[jsonString dataUsingEncoding:NSUTF8StringEncoding]]; 
[request setDelegate:self]; 
[request setUserInfo:[NSDictionary dictionaryWithObject:report forKey:@"Report"]]; 
[request setDidFailSelector:@selector(submitReportRequestWentWrong:)]; 
[request setDidReceiveDataSelector:@selector(submitReportRequestDone:)]; 
[requests addObject:request]; 
[submittingReportQueue addOperation:request]; 

Voici mes méthodes de délégués:

- (void)submitReportQueueWentWrong:(ASINetworkQueue *)queue 
{ 
    NSLog(@"Submit Report WentWRong"); 

// 
- (void)submitReportQueueFinished:(ASINetworkQueue *)queue 
{ 
    NSLog(@"Submit Report QueueFinished"); 

} 
// 
- (void)submitReportRequestWentWrong:(ASIHTTPRequest *)request 
{ 
     NSLog(@"Submit Report Queue went wrong"); 
} 

// 
- (void)submitReportRequestDone:(ASIHTTPRequest *)request 

{//do work here} 

Cependant ASIHTTPRequest.m jette exception après un bloc de code:

// Does the delegate want to handle the data manually? 
if ([[self delegate] respondsToSelector:[self didReceiveDataSelector]]) { 
    NSMethodSignature *signature = [[[self delegate] class]  
      instanceMethodSignatureForSelector:[self didReceiveDataSelector]]; 
    NSInvocation *invocation = [[NSInvocation invocationWithMethodSignature:signature] 
      retain]; 
[invocation setSelector:[self didReceiveDataSelector]]; 
[invocation setArgument:&self atIndex:2]; 
NSData *data = [NSData dataWithBytes:buffer length:bytesRead]; 
[invocation setArgument:&data atIndex:3]; 
[invocation retainArguments]; 
[self performSelectorOnMainThread:@selector(invocateDelegate:) withObject:invocation waitUntilDone:[NSThread isMainThread]]; 

[invocation setArgument: & atIndex de données: 3 ] throws Exception, erreur message est 'NSInvalidArgumentException', raison: '*** - [NSInvocation setArgument: atIndex:]: index (3) hors limites [-1, 2]'

Qu'est-ce que je faire le mal?

Merci `

Répondre

1

Le problème est ici:

[request setDidReceiveDataSelector:@selector(submitReportRequestDone:)]; 

et ici:

- (void)submitReportRequestDone:(ASIHTTPRequest *)request 


Le didReceiveDataSelector est probablement pas celui que vous vouliez, comme on l'appelle à chaque fois un morceau de données est reçu - je soupçonne que vous voulez être appelé lorsque la demande est terminée, de sorte que vous devez d au lieu régler le sélecteur de requestDidFinish:

[request setRequestDidFinishSelector:@selector(submitReportRequestDone:)]; 


Pour votre information, l'erreur que vous voyez signifie essentiellement « Le sélecteur vous me avez donné ne porte pas la signature d'appel droit » ou plus précisément " J'essaie d'appeler une méthode qui prend 2 paramètres, et votre méthode ne prend que 1 ". (Si je me souviens bien, la raison pour laquelle elle échoue sur l'index 3 est que le premier paramètre est un paramètre caché contenant l'objet.)

Questions connexes