RedMadRobot / figma-export

Command line utility to export colors, typography, icons and images from Figma to Xcode / Android Studio project
MIT License
726 stars 114 forks source link

Make file download requests chunked #75

Closed NoFearJoe closed 3 years ago

NoFearJoe commented 3 years ago

I've found an issue with fetching asset files – if there are many files in a frame, you get the Request timed out error after 60 seconds of downloading.

This happens because all file download requests add in a URLSession at the same moment. URLSession has a maximum simultaneous requests count and all requests after this count wait in the queue. And when this is their turn to execute, they have already timed out.

I solved this problem by chunking requests in FileDownloader.

Alexander-Ignition commented 3 years ago

Привет, @NoFearJoe

У тебя получилось интересное решение через DispatchGroup.
На каком примерно количестве запросов и объеме ресурсов у тебя получилось оптимизировать загрузку?

Жаль что у нас нет тестов на это. Не хочешь ли еще ускорить загрузку используя DispatchSemaphore вместо чанков с DispatchGroup?

NoFearJoe commented 3 years ago

@Alexander-Ignition , привет.

У нас сейчас чуть больше ста иллюстраций во фрейме. Учспевали скачаться примерно половина из них.

Я думал сначала сделать на DispatchSemaphore, но решил не отходить далеко от вашего подхода. Могу переделать и добавить тестов.

subdan commented 3 years ago

Я думал сначала сделать на DispatchSemaphore, но решил не отходить далеко от вашего подхода. Могу переделать и добавить тестов.

Да, надо переделать на DispatchSemaphore. Это в несколько раз ускорит скачивание файлов.

С DispatchSemaphore 120 больших картинок скачиваются за 9 сек.

semaphore_9sec

Вот код этого решения — https://gist.github.com/subdan/76316cfb2a9144249c5a512c27e56b63 Можешь отсюда скопировать, только os_signpost удали.

Твое решение с разбиением на группы отрабатывает за 30 сек с теми же 120 картинками.

no_semaphore_30sec
subdan commented 3 years ago

Для сравнения, вот как скачиваются файлы сейчас в master. Синяя полоска это время от task.resume() до срабатывания completion.

image

Видно, что общее время загрузки файлов почти не отличается от моего решения с DispatchSemaphore. Но тут важно, что задача на загрузку файла может очень долго ждать своей очереди из-за чего может возникнуть таймаут. Надеюсь решение с DispatchSemaphore поможет вам избавится от проблемы с тайм-аутом.

NoFearJoe commented 3 years ago

@subdan Использовал твой код с семафором. Спасибо)

NoFearJoe commented 3 years ago

Поправил

subdan commented 3 years ago

Опубликовал новую версию. Проверь, работает ли теперь экспорт картинок.

NoFearJoe commented 3 years ago

@subdan Заработало