2013-07-26 1 views
0

Я выполняю многоасинхронный (делегировать, а не блок) NSURLConnections одновременно, и все они возвращаются очень быстро, когда я нахожусь на LAN-сервере.несуществующий NSURLConnection никогда не выполняет или не истекает

Каждый так часто один NSURLConnection будет исчезать и никогда не вернуться.

connection:willSendRequest: называется, но connection:didReceiveResponse: (и неисправность) нет.

Любые идеи? Мне интересно, если я должен сделать простую замену, используя вместо этого CFNetwork.

Редактировать: на самом деле кода очень мало. То, что я сделал, создает класс-оболочку для загрузки файлов. Отмечу, что проблема возникает минус, когда я запускаю соединение в отдельной очереди - но все же происходит.

Общий смысл того, что я делаю, создает запрос на загрузку каждой ячейки в виде прокрутки таблицы (в cellForRowAtIndexPath), а затем асинхронную загрузку в файл изображения в ячейку таблицы, если ячейка все еще видна.

_request = [NSMutableURLRequest requestWithURL:_URL]; 
_request.cachePolicy = NSURLRequestReloadIgnoringCacheData; 
_request.timeoutInterval = _timeoutInterval; 

if(_lastModifiedDate) { 
    [_request setValue:[_lastModifiedDate RFC1123String] forHTTPHeaderField:@"If-Modified-Since"]; 
} 


_connection = [[NSURLConnection alloc] initWithRequest:_request 
               delegate:self 
             startImmediately:NO]; 
[_connection start]; 

В соответствии с просьбой, переменные экземпляра:

NSMutableURLRequest *_request; 
NSURLConnection *_connection; 

И делегируют методы:

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response { 
    NSLog(@"%@ send", _URL); 
    return request; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    NSLog(@"%@ response", _URL); 
    _response = (id)response; 
    // create output stream 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    _receivedLength += data.length; 
    _estimatedProgress = (Float32)_receivedLength/(Float32)_response.expectedContentLength; 
    [_outputStream write:data.bytes maxLength:data.length]; 

    // notify delegate 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // close output stream 
    // notify delegate 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    NSLog(@"%@ failure", _URL); 
    // notify delegate 
} 

- (void)connection:(NSURLConnection *)connection 
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 
    if(_credential && challenge.previousFailureCount == 0) { 
     [[challenge sender] useCredential:_credential forAuthenticationChallenge:challenge]; 
    } 
} 
+0

Можете ли вы предоставить более подробную информацию о вас кода, пожалуйста? Кстати, у меня аналогичная проблема с NSURLConnection тоже. Вы находите какое-то общее между вашим и моим [здесь] (http://stackoverflow.com/questions/17848290/nsurlconnection-doesnt-receive-data-when-creating-many-downloading-objects-in-i) – Envil

+0

Пожалуйста, покажите объявление для '_request' и' _connection', а также ваши методы делегирования (разделенные). Что, между прочим, «делегировать»? Это диспетчер представлений, другой объект? –

+0

Это, по сути, «я» для этой дискуссии. У меня есть опция на моем объекте-оболочке, чтобы использовать слабый прокси-сервер, чтобы NSURLConnection не поддерживал мой объект. Этот флаг отключен в этом случае. – xtravar

ответ

1

После того, как я прокололся в профилировщике, я нашел лидерство, и это дало мне догадки.

Мои учетные данные были неудачными (не знаю, почему ...), и поэтому previousFailureCount не был 0, и, следовательно, я не использовал свой учетный объект.

Изменен код для этого и у меня нет никаких проблем:

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 
    if(_credential) { 
     [[challenge sender] useCredential:_credential forAuthenticationChallenge:challenge]; 
    } 
} 
+0

Это тоже не правильно;) Сначала вам нужно проверить, какой тип аутентификации требуется: получить защитное пространство, а затем извлечь метод проверки подлинности. Вы предоставляете учетные данные только для 'NSURLAuthenticationMethodHTTPBasic' и' NSURLAuthenticationMethodHTTPDigest'. – CouchDeveloper

0

NSURLConnection пришлют либо didReceiveResponse или didFailWithError.

Часто вы занимаетесь таймаутами до того, как произойдет didFailWithError.

+0

Вот что говорит документация, но этого не происходит. – xtravar

+0

@xtravar, показать код. Я широко использовал NSURLConnection, и у меня никогда не было проблемы, которая не была ошибкой пользователя.:) –

+0

Я добавил несколько подробностей о том, что я делаю. Честно говоря, я слишком много работал с NSURLConnection и не сталкивался с этим. Но я так никогда и не создавал такого количества одновременно. – xtravar