NSURLConnection зависает при получении не слишком большого количества данных - PullRequest
0 голосов
/ 21 июня 2010

У меня есть код здесь:

(...)
NSURLConnection *theConnection = [[NSURLConnection alloc] 
                initWithRequest:theRequest delegate:self];
if( theConnection )
{
    webData = [[NSMutableData data] retain];
}

и методы делегата:

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{   
    NSLog(@"zero");
   [webData setLength: 0];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"got %d", [data length]);
    [webData appendData:data];
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"ERROR with theConenction");
    [connection release];
    [webData release];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{

    NSLog(@"DONE. Received Bytes: %d", [webData length]);
    [connection release];
    [webData release];      
}

Работает довольно хорошо, пока не придет больше данных. Чем NSURLConnection «перестать работать» (без ошибок, без исключений, без выхода). Я все еще могу использовать свое приложение. Я заметил, что проблема начинается, когда didReceiveData вызывается более одного раза во время соединения.

Как выглядит шаг за шагом от отладчика:

1. I call theRequest
2. Delegate call didReceiveResponse

2010-06-21 18: 10: 16,708 MyApp [9477: 207] ноль

3. Delegate call didReceiveData

2010-06-21 18: 10: 16,709 MyApp [9477: 207] получил 6912

(GDB) продолжить

4. Delegate call didReceiveData (once again)

2010-06-21 18: 10: 18.027 MyApp [9477: 207] получил 114067

(GDB) продолжить

--> and here is the problem <--

основной цикл продолжается без точки останова, и connectionDidFinishLoading не вызывается. Все в порядке, когда didRecieveData вызывается только один раз.

5. Delegate call didFailWithError (after 5 min!)

2010-06-21 18: 15: 18.041 MyApp [9477: 207] ОШИБКА при подключении Соединение не удалось! Ошибка - Операция не может быть завершена. Сброс соединения по пиру

(GDB) продолжить

=============== ОБНОВЛЕНИЕ ====================

Наконец, я обнаружил одну важную вещь: истинная проблема заключается в том, что удаленный хост иногда не завершает соединение должным образом (т. Е. Большой объем данных), поэтому делегат connectionDidFinishLoading не может быть вызван, и через 5 минут удаленный хост сбросить соединение.

Кто-нибудь тоже проблема и может помочь?

Ответы [ 2 ]

0 голосов
/ 01 августа 2011

Наконец, я обошел проблему, используя ASIHTTPRequest

0 голосов
/ 21 июня 2010

Если вы ставите точки останова, говорит ли он, где они остановились?

...