2014-02-05 6 views
1

У меня есть NSURLConnection, которое работает некоторое время и внезапно не работает.NSURLConnection не возвращает данные

По какой-то причине, единственный метод делегата, который вызывается является:

-(void)connection:(NSURLConnection *)connection didReceiveResponse: 

Ни один из других методов делегата не дозвонились. У меня есть другие классы, которые используют почти тот же код, просто другой запрос и URL-адрес, и все они работают нормально. Я прочитал много сообщений, которые говорят о том, что соединение находится в той же теме, что и делегат, но ничего не работает для меня. Я знаю, что сервер возвращает ответ, потому что, если я передаю одну и ту же информацию через простую форму html, я получаю ответ в своем браузере, и я вижу доказательства того, что работает мой скрипт на стороне сервера, потому что я вижу изменения, которые он делает в данные SQL. И приложение получает какой-то ответ, его просто не получают никаких данных или вызывают метод делегирования connectionDidFinishLoading.

Любые идеи о том, что может быть проблемой?

Вот упрощенная версия на мой код:

#import "RegistrationViewController.h" 

@interface RegistrationViewController() 

@end 

NSMutableData *responseData; 
NSURLConnection *theconnection; 

@implementation RegistrationViewController 
/* 
* Attempt to Register online. Returns False if valiation failed 
*/ 
- (BOOL) registerOnline{ 

    // OTHER CODE HERE TO BUILD DATA FOR THE REQUEST 

    // URL Request 
    NSURL *requestUrl = [NSURL URLWithString:THEURL]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:requestUrl]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:[NSData dataWithBytes:[bodyData UTF8String] length:strlen([bodyData UTF8String])]]; 


    // Initialse Response Object 
    responseData = [[NSMutableData alloc] init]; 

    // Conection 
    theconnection = [NSURLConnection connectionWithRequest:request delegate:self]; 
    [theconnection start]; 

    return YES; 
} 

/* 
* Handle the event of registration failing 
*/ 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
    NSLog(@"didFailWithError"); 

    // OTHER CODE HERE TO HANDLE THE ERROR.... 

} 

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
    NSLog(@"did receive response "); 

} 

/* 
* Handle the reciept of Data 
*/ 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    NSLog(@"didReceiveData"); 

    // Add data to the response 
    [responseData appendData:data];\ 
} 

/* 
* Data finnished loading 
*/ 
-(void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    NSLog(@"connectionDidFinishLoading"); 

    // OTHER CODE HERE TO HANDLE THE RESPONSE.... 
} 
+0

Кстати, вы пропадаете значения, полученные в 'bodyData', с помощью' CFURLCreateStringByAddingPercentEscapes'? Кроме того, если 'bodyData' строка,' [request setHTTPBody: [bodyData dataUsingEncoding: NSUTF8StringEncoding]] '. – Rob

+0

Да, я делаю это, Просто не показывай это выше, потому что я не думал, что это необходимо. Я уверен, что сервер успешно получает мои данные запроса. – user1775671

ответ

0

Вы должны смотреть на реакцию и диагностировать, что происходит. Например, если statusCode не 200, может возникнуть проблема. См. HTTP/1.1 Status Code Definitions.

Таким образом, вы можете проверить statusCode:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    if ([response isKindOfClass:[NSHTTPURLResponse class]]) { 
     NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; 

     if (statusCode == 200) { 
      NSLog(@"received successful (200) response "); 
     } else { 
      NSLog(@"whoops, something wrong, received status code of %d", statusCode); 
     } 
    } else { 
     NSLog(@"Not a HTTP response"); 
    } 
} 

Вы также призывают:

theconnection = [NSURLConnection connectionWithRequest:request delegate:self]; 

Это запускает соединение автоматически. По телефону

[theconnection start]; 

вы начинаете его во второй раз. Удалите метод start или используйте initWithRequest:delegate:startImmediately: с NO для этого окончательного параметра.

+0

Хорошо, спасибо, я получаю код состояния 200 – user1775671

+0

@ user1775671 Очень хорошо. Попробуйте удалить избыточный метод «start» и посмотреть, не устраняет ли это ситуацию. – Rob

+0

Да, я пробовал это. Я не могу представить, что это большая проблема. Разве это не заставит его отправить запрос дважды? – user1775671

0

Если это может помочь никому, проблема для меня было то, что я начал подключение в качестве другого потока

Так что не забудьте позвонить

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

или

theconnection = [NSURLConnection connectionWithRequest:request delegate:self]; 
[theconnection start]; 

в основной поток.

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