2010-08-17 4 views
1

У меня есть экземпляр ASINetworkQueue, и я добавил экземпляры ASIHTTPRequest в очередь; Тем временем у меня есть методы делегата, установленные для очереди, а также каждого из запросов:ASIHTTPRequest: Ошибка при попытке вызвать мой метод делегата

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

и в цикле я добавил запрос в очереди, добавить вызов [submittingReportQueue перейти] вне цикла.

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]; 

Ниже приведены мои методы делегата:

- (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} 

Однако ASIHTTPRequest.m бросает исключение в следующий блок кода:

// 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]]; 

[призывание setArgument: & данные atIndex: 3 ]; бросает исключение, ошибка сообщение 'NSInvalidArgumentException', причина: "*** - [NSInvocation setArgument: atIndex]: индекс (3) вне границ [-1, 2]

Что я сделал делать неправильно?

Благодаря `

ответ

1

Проблема в том, здесь:

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

и здесь:

- (void)submitReportRequestDone:(ASIHTTPRequest *)request 


didReceiveDataSelector, вероятно, не один вы хотите, как это называется каждый раз получен фрагмент данных - я подозреваю, что вы хотите, чтобы его вызывали, когда запрос был завершен, поэтому вы shoul d вместо этого установить переключатель requestDidFinish:

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


Для вашей информации, ошибка вы видите, по существу, означает «Селектор вы дали мне не имеет право подписи вызова» или более конкретно " Я пытаюсь вызвать метод, который принимает 2 параметра, и ваш метод принимает только 1 ". (Если я правильно помню, причина, по которой он терпит неудачу в индексе 3, заключается в том, что первым параметром является скрытый параметр, содержащий объект.)

Смежные вопросы