Возможность возобновления загрузки в NSURLConnection

Я загружаю очень большие данные с сервера с классом NSURLConnection.

Как я могу реализовать средство приостановки, чтобы возобновить загрузку?

Ответ 1

Вы не можете сделать паузу, но вы можете отменить соединение, а затем создать новый, чтобы возобновить работу, когда старое остановилось. Однако сервер, к которому вы подключаетесь, должен поддерживать заголовок Range. Установите для этого значение "bytes = size_already_downloaded-", и он должен правильно подбирать, где вы его отменили.

Ответ 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];. Если размеры совпадают, вы, вероятно, хотите отменить соединение.