0

私は多くの非同期 (ブロックではなくデリゲート)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];
    }
}
4

2 に答える 2

0

Aは または のいずれかNSURLConnectionを送信します。didReceiveResponsedidFailWithError

多くの場合、発生する前にタイムアウトを処理していますdidFailWithError

于 2013-07-26T02:04:11.657 に答える