11

NSURLConnection クラスを使用してサーバーから非常に大きなデータをダウンロードしています。

ダウンロードを再開できるように一時停止機能を実装するにはどうすればよいですか?

4

2 に答える 2

15

それ自体を一時停止することはできませんが、接続をキャンセルしてから新しい接続を作成して、古い接続が中断したところから再開することはできます。ただし、接続先のサーバーは Range ヘッダーをサポートしている必要があります。これを「bytes=size_already_downloaded-」に設定すると、キャンセルした場所からすぐに取得されます。

于 2010-03-16T12:30:44.473 に答える
2

ダウンロードを再開して残りのファイルを取得するには、次のRangeようにして HTTP リクエスト ヘッダーに値を設定します。

- (void)downloadFromUrl:(NSURL*)url toFilePath:(NSString *)filePath {

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url     cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
    if (!request) {
        NSLog(@"Error creating request");
        // Do something
    }
    [request setHTTPMethod:@"GET"];

    // Add header to existing file
    NSFileManager *fm = [NSFileManager defaultManager];
    if([fm fileExistsAtPath:filePath]) {
        NSError *error = nil;      
        NSDictionary * fileProp = [fm attributesOfItemAtPath:filePath error:&error];
        if (error) {
            NSLog(@"Error: %@", [error localizedDescription]);
            // Do something
        } else {
            // Set header to resume 
            long long fileSize = [[fileProp objectForKey:@"NSFileSize"]longLongValue];
            NSString *range = @"bytes=";
            range = [[range stringByAppendingString:[[NSNumber numberWithLongLong:fileSize] stringValue]] stringByAppendingString:@"-"];
            [request setValue:range forHTTPHeaderField:@"Range"];
        }
    }
    NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    if (!connection) {
        NSLog(@"Connection failed.");
        // Do something
    }
}

また - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response、予想されるサイズを確認することで、既存のファイルが完全にダウンロードされているかどうかを確認するために使用できます: [response expectedContentLength];. サイズが一致する場合は、おそらく接続をキャンセルする必要があります。

于 2013-09-18T21:00:40.930 に答える