私は多くの非同期 (ブロックではなくデリゲート)NSURLConnections
を同時に実行していますが、LAN サーバーにアクセスしていると、それらはすべて非常に迅速に戻ってきます。
時々、人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];
}
}