在NSURLConnection中恢复下载功能

时间:2010-03-16 06:37:55

标签: iphone nsurlconnection nsurlrequest

我正在使用NSURLConnection类从服务器下载一些非常大的数据。

如何实施暂停功能以便我可以继续下载?

2 个答案:

答案 0 :(得分:14)

您不能暂停,但您可以取消连接,然后创建一个新连接以恢复旧的左侧。但是,您要连接的服务器必须支持Range标头。将其设置为“bytes = size_already_downloaded-”,它应该在你取消它的地方找到。

答案 1 :(得分:2)

要继续下载并获取文件的其余部分,您可以通过执行以下操作在HTTP请求标头中设置Range值:

- (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];检查现有文件是否已完全下载。如果尺寸匹配,您可能想要取消连接。