2012-04-18 2 views
0

Я уже посмотрел на NSURLConnectionDelegate connection:didReceiveData not working, но, похоже, от этого не было хорошего результата, поэтому мне любопытно, почему я не могу получить какие-либо данные.NSUrlConnectionDelegate не вызывает методы для загрузки данных

Я поставил точки останова в didReceiveResponse и didReceiveData.

Он распечатывает «соединение успешно», поэтому я знаю, что соединение запущено.

Я использую ARC для управления памятью.

- (void)load { 
     request = [NSMutableURLRequest requestWithURL:myURL 
                  cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
                 timeoutInterval:60]; 

    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    if (conn) { 
     [conn start]; 
     NSLog(@"connection succeeded, %s", [myURL description]); 
     responseData = [NSMutableData data]; 
    } else { 
     NSLog(@"connection failed"); 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    responseData = [[NSMutableData alloc] init]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [responseData appendData:data]; 
} 

UPDATE:

Чтобы увидеть, как я могу проверить этот взгляд на Asynchronous unit test not being called by SenTestCase.

Я реализовал два метода, упомянутых jonkroll, в его ответе я просто их не показывал, но они также не вызываются.

Я добавил [conn start] только потому, что он не работал, и я надеялся, что это может решить, но такой удачи нет.

ответ

3

Когда вы объявляете соединение, как это:

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

Вы создаете локальный указатель. Когда ваш метод завершается, так как это была последняя сильная ссылка на NSURLConnection, ARC освобождает его. Вам нужно использовать сильное свойство ivar (и/или), чтобы удержать сильную ссылку на созданный вами NSURLConnection.

Редактировать

Вот основной пример кода, который я тестировал в образце проекта. Дайте ему пробег. Помогает подробный каротаж.

@implementation <#Your class here#> { 
    // With ARC ivars are strong by default 
    NSMutableData *_downloadedData; 
    NSURLConnection *_connection; 
} 
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
    NSHTTPURLResponse *realResponse = (NSHTTPURLResponse *)response; 
    if (realResponse.statusCode == 200){ 
     // Really any 2** but for example 
     _downloadedData = [[NSMutableData alloc] init]; 
     NSLog(@"Good response"); 
    } else { 
     NSLog(@"Bad response = %i",realResponse.statusCode); 
    } 
} 
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    if (connection == _connection){ 
     [_downloadedData appendData:data]; 
     NSLog(@"Getting data..."); 
    } 
} 
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    if (connection == _connection){ 
     _connection = nil; 
     NSLog(@"We're done, inform the UI or the delegates"); 
    } 
} 
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
    _connection = nil; 
    NSLog(@"Oh no! Error:%@",error.localizedDescription); 
} 
- (void)load { 
    NSURL *url = [NSURL URLWithString:@"http://www.google.com/"]; 
    NSURLRequest *request = [NSMutableURLRequest requestWithURL:url 
             cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
            timeoutInterval:60]; 
    // Assign strong pointer to new connection 
    _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    NSLog(@"Connection was initialized? = %@",(!!_connection)[email protected]"YES":@"NO"); 
} 
@end 
+0

Я изменил conn, чтобы быть следующим: @property NSURLConnection * conn; Но я получаю тот же результат, данные не получены. После ожидания чуть более 90 секунд мой модульный тест перестает ждать и терпит неудачу. –

+0

@JamesBlack Я добавил несколько тестовых примеров кода. – NJones

+0

Я еще не уверен в различии, но теперь он работает, благодаря вам. –

0

Метод NSURLConnection initWithRequest запускает асинхронный запрос данных с URL-адреса. Поскольку запрос выполняется асинхронно, вы не можете ожидать ответа с ответом тем же методом, в котором вызывается запрос. Вместо этого вам нужно сделать это в методах обратного вызова делегата NSURLConnection. Вы уже внедрили didReceiveResponse: и didReceiveData:, но есть пара других, которые будут вам полезны.

Если вы хотите посмотреть на содержание ответа, вы должны сделать это в connectionDidFinishLoading:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    // response is complete, do something with the data 
    NSLog(@"%@", responseData); 
} 

Тот факт, что ваш код печатает «соединение установлено» на самом деле не означает, что запрос был успешным, только что объект NSURLConnection был создан успешно. Для того, чтобы проверить, существует ли проблема с подключением вы можете реализовать метод делегата connection:didFailWithError:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    NSLog(@"Connection failed! Error - %@ %@", 
      [error localizedDescription], 
      [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]); 
} 

Также нет необходимости вызывать [conn start]. Запрос будет запущен автоматически, когда вы позвоните initWithRequest:

Я предлагаю прочитать документацию Apple по телефону Using NSURLConnection для получения более подробной информации.

+0

спасибо. Я добавил [conn start], поскольку он не работал, и я также реализовал другие методы, но, опять же, ни один из них, похоже, ничего не делает, согласно моему протоколу. –

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