Пауза/возобновление загрузки в Objective-C

Хорошо. Надеюсь, это будет мой последний пост о менеджере загрузки, который я пишу в Objective-C. Кажется, что все работает хорошо, за исключением функции паузы/возобновления. Моя проблема в том, что когда загрузка пытается продолжить с того места, где она была остановлена, она добавляет данные, которые она получает в файл, но все же кажется, что она пытается загрузить весь файл. Это приводит к тому, что файл, который больше исходного файла, должен быть. Вот код, который я использую для загрузки файлов. Я что-то делаю неправильно?

-(void)start:(unsigned int)fromByte {
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:DEFAULT_TIMEOUT];

    // Define the bytes we wish to download.
    NSString *range = [NSString stringWithFormat:@"bytes=%i-", fromByte];
    [request setValue:range forHTTPHeaderField:@"Range"];

    // Data should immediately start downloading after the connection is created.
    self.urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:TRUE];

    if (!self.urlConnection) {
        #warning Handle error.
    }
}

Ответы

Ответ 1

Я, наконец, понял это. Оказывается, метод 'getFilesizeInBytes', который у меня был, - это получить объект NSFileSize из атрибутов файла, но я сразу перевел его на int. Это привело к тому, что число было примерно в 20 раз больше, чем должно было быть. Я смог исправить это, используя [@"" intValue]. Как только это было исправлено, серверы могли дать мне остальную часть файла, начиная с правильного байта. Похоже, что до моего вопроса не было того, что сервер не выполнял мой запрос, но он не мог выполнить мой запрос из-за того, что я запрашивал данные, которые были значительно выше финального байта файла.

Ответ 2

Я вижу, что вы указываете заголовок Range в запросе. Прежде всего нужно проверить, действительно ли сервер выполняет запрос диапазона, проверяя заголовки в объекте ответа (который должен быть NSHTTPURLResponse) в connection:didReceiveResponse: для правильного Content-Range.

Ответ 3

Нет поддержки для приостановки/возобновления в NSURLConnection. Вы можете эмулировать его, остановив запрос, а затем отправив запрос на оставшуюся часть содержимого с заголовком Range при возобновлении. Для этого требуется некоторая поддержка HTTP-сервера и не гарантируется.

Похоже, что отсутствие поддержки на сервере - это то, с чем вы сталкиваетесь.

Большинство менеджеров загрузки, однако, реализуют свой собственный HTTP-стек поверх сокетов.