Closed NoFearJoe closed 3 years ago
Привет, @NoFearJoe
У тебя получилось интересное решение через DispatchGroup
.
На каком примерно количестве запросов и объеме ресурсов у тебя получилось оптимизировать загрузку?
Жаль что у нас нет тестов на это.
Не хочешь ли еще ускорить загрузку используя DispatchSemaphore
вместо чанков с DispatchGroup
?
@Alexander-Ignition , привет.
У нас сейчас чуть больше ста иллюстраций во фрейме. Учспевали скачаться примерно половина из них.
Я думал сначала сделать на DispatchSemaphore
, но решил не отходить далеко от вашего подхода. Могу переделать и добавить тестов.
Я думал сначала сделать на
DispatchSemaphore
, но решил не отходить далеко от вашего подхода. Могу переделать и добавить тестов.
Да, надо переделать на DispatchSemaphore
. Это в несколько раз ускорит скачивание файлов.
С DispatchSemaphore
120 больших картинок скачиваются за 9 сек.
Вот код этого решения — https://gist.github.com/subdan/76316cfb2a9144249c5a512c27e56b63 Можешь отсюда скопировать, только os_signpost удали.
Твое решение с разбиением на группы отрабатывает за 30 сек с теми же 120 картинками.
Для сравнения, вот как скачиваются файлы сейчас в master. Синяя полоска это время от task.resume()
до срабатывания completion
.
Видно, что общее время загрузки файлов почти не отличается от моего решения с DispatchSemaphore
. Но тут важно, что задача на загрузку файла может очень долго ждать своей очереди из-за чего может возникнуть таймаут. Надеюсь решение с DispatchSemaphore
поможет вам избавится от проблемы с тайм-аутом.
@subdan Использовал твой код с семафором. Спасибо)
Поправил
Опубликовал новую версию. Проверь, работает ли теперь экспорт картинок.
@subdan Заработало
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
.