У меня есть код здесь:
(...)
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 минут удаленный хост сбросить соединение.
Кто-нибудь тоже проблема и может помочь?