0

サーバーからいくつかのファイルをダウンロードする必要があります。それを行うための最良の方法は何ですか?すべてのドキュメントはNSMutableArrayに保存され、ドキュメントごとに2つのファイル(ドキュメント自体とその変更ログ)があります。だから私がすることは:

- (void)downloadDocuments:(int)docNumber
{
    NSString *urlString;
    NSURL *url;   
    for (int i=0; i<[items count]; i++) {
        [progressBar setProgress:((float)i/[items count]) animated:YES];
        urlString = [[items objectAtIndex:i] docUrl];
        url = [[NSURL alloc] initWithString:[urlString stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
        [self downloadSingleDocument:url];
        urlString = [[items objectAtIndex:i] changeLogUrl];
        url = [[NSURL alloc] initWithString:[urlString stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
        [self downloadSingleDocument:url];
    }
    urlString = nil;
    url = nil;
    [self dismissModalViewControllerAnimated:YES];
}

- (void)downloadSingleDocument:(NSURL *)url
{
    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
    [req addValue:@"Basic XXXXXXX=" forHTTPHeaderField:@"Authorization"];
    downloadConnection = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES];
}

- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)response
{
    if (conn == downloadConnection) {
        NSString *filename = [[conn.originalRequest.URL absoluteString] lastPathComponent];
        filename = [filename stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

        filePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:filename];
        [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];

        file = [[NSFileHandle fileHandleForUpdatingAtPath:filePath] retain];
        if (file)
        {
            [file seekToEndOfFile];
        }
    }

}


- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data
{
    if (conn == downloadConnection) {
        if (file) { 
            [file seekToEndOfFile];
        }
        [file writeData:data];
    }

}


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

    if (conn==downloadConnection) {
        [file closeFile];
    }
}

そして私の問題は、最後のファイルだけがダウンロードされることです。私が間違っていることについて何か提案はありますか?助けてくれてありがとう!

4

1 に答える 1

1

問題は、ループ内のメンバー変数「downloadConnection」をNSURLConnectionの新しいインスタンスで「上書き」することです(メソッド呼び出しdownloadSingleDocumentを介して)。これを行うと、didReceiveResponse、didReceiveData、connectionDidFinishメソッド内のifステートメントは、最後に作成された接続でのみtrueと評価される場合があります。これを回避するには、接続のリストを使用してみてください。

于 2012-05-16T10:27:20.843 に答える