Скачивание файлов с докачкой

Потребовалось и мне наконец-то разобраться с тем, как в iOS реализуется скачивание с возможностью докачки. Как оказалось, это всего лишь немного сложнее, чем обычное скачивание файлов, и сегодня я поделюсь «секретом» и с вами.

Итак, что же нам требуется? Самое главное — чтобы сервер поддерживал докачку. В противном случае волшебство не сработает и кролик из шляпы не появится.

Суть схемы — закачиваем данные во временный файл. Если временного файла нет — либо уже скачали, либо еще не начали закачивать. Если уже часть закачали, то определяем размер скачанного и добавляем в запрос заголовок «качать отсюда и до следующего столба». Когда докачаем файл полностью, перемещаем временный файл на место постоянного.

Поехали!

Далее переходим к реализации протокола NSURLConnectionDataDelegate, который надо не забыть добавить в нашем класс.

Вот и все. Конечно, в реальной жизни дела обстоят несколько сложнее. Например, вам обычно требуется приделать механизмы для ручной и автоматической остановки и продолжения закачки, а бывает, что качать нужно не один, а кучу файлов одновременно. Все это решаемо, но тут уже вы и без меня разберетесь. 😉

Написано с использованием материалов статьи Docset Viewer: Resuming large downloads with NSURLConnection © Michael Nachbaur

2 комментария

  1. Добрый день. А не подскажете как качать файл в несколько потоков, например, с нескольких источников по своему «куску» с каждого?

    1. Сразу скажу, что мне этого не требовалось и потому не разбирался. Но копнул бы в сторону примерно такого алгоритма:
      1. Создаём файл с выделением нужного размера и заполняем нулями. Файл временный где-нибудь в отдельной папке, чтобы с ним не пытались работать как с нормальным.
      2. Создаём файл с некоей «картой», по которой будем отслеживать, какие куски уже скачали и всё ли скачали.
      3. Рисуем некий менеджер, который будет рулить тем, сколько потоков запустить и какому потоку что качать. Задачи выдаёт на основе своего конфига и текущего состояния «карты».
      4. Менеджер запускает поток, тот запрашивает с сервера нужный кусок файла и после получения вставляет в нужную область временного файла из п.1
      п.4 повторяем пока вся карта не покажет, что файл получен. Это проверяет менеджер при запуске и при получении от потока сообщения об изменениях. Как всё готово — перекидываем файл куда хотели, а карту удаляем.

Добавить комментарий для nornad Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.