Пауза/возобновление загрузки в 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-стек поверх сокетов.