October 26, 2023

Пайплайн загрузки приложения

Обычно при запуске приложения необходимо сделать предзагрузку. В каждом проекте инициализация может осуществляться по-разному: в одних проектах — это просто загрузка игровой сцены и данных игрока из PlayerPrefs, в других — это целый ритуал: подключение к различным сервисам и SDK, синхронизация данных с сервером, скачивание ассетов, проверка на обновления и так далее...

Если этот код инициализации не структурировать, то будет каша, которую будет сложно поддерживать:

Класс Application Loader нарушает принцип открытости-закрытости (OCP)

Поэтому вместо каждого конкретного процесса можно выделить общий интерфейс ILoadingTask, который будет выполнять асинхронную операцию и возвращать результат выполнения:

Интерфейс элемента загрузки приложения

В качестве аргументов метод ILoadingTask.Do() будет принимать делегат обратного вызова, в который будет передаваться результат выполнения задачи LoadingResult:

Результат имеет статус завершения и текст для ошибки

А сам класс загрузки приложения будет выглядеть так:

Теперь класс ApplicationLoader соблюдает принцип открытости-закрытости (OCP)

В классе загрузчика появились события OnLoadingCompleted и OnLoadingFailed, на них можно будет подписаться и показать сообщение на UI, если произошла ошибка:

Контроллер для экрана загрузки в UI

Теперь для каждой задачи сделаем свою реализацию ILoadingTask:

Пример реализации задач инициализации

Также можно прикрутить прогресс загрузки, добавив параметр веса к каждой задаче:

Добавление веса прогресса в задачу
Добавление прогресса загрузки

Обратите внимание, что реализация LoadingTask должна получить зависимости на необходимые компоненты системы через конструктор или метод пост-инъекции. На Zenject это будет выглядеть примерно так:

Пример инициализации списка задач.

Еще дополнительно хотел бы отметить, что при такой реализации можно применить GoF паттерн компоновщик и сделать композитные таски:

Последовательно выполняет дочерние таски...
Параллельно выполняет дочерние таски...

Выводы

Таким образом, используя интерфейс ILoadingTask, система загрузки становится более гибкой, поддерживаемой и масштабируемой. У разработчика появляется возможность настраивать древо загрузки приложения, используя как атомарные так и композитные таски, а результаты загрузки можно выводить на экран.

Надеюсь, было полезно! Спасибо за внимание :)