Пауза / Возобновление загрузки в Objective-C - PullRequest
13 голосов
/ 02 марта 2011

Хорошо. Надеюсь, это будет мой последний пост о менеджере загрузок, который я пишу в 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.
    }
}

Ответы [ 3 ]

5 голосов
/ 02 марта 2011

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

1 голос
/ 03 марта 2011

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

0 голосов
/ 02 марта 2011

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

Похоже, вы испытываете недостаток поддержки на сервере.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...