Пайплайн загрузки приложения
Обычно при запуске приложения необходимо сделать предзагрузку. В каждом проекте инициализация может осуществляться по-разному: в одних проектах — это просто загрузка игровой сцены и данных игрока из PlayerPrefs, в других — это целый ритуал: подключение к различным сервисам и SDK, синхронизация данных с сервером, скачивание ассетов, проверка на обновления и так далее...
Если этот код инициализации не структурировать, то будет каша, которую будет сложно поддерживать:
Поэтому вместо каждого конкретного процесса можно выделить общий интерфейс ILoadingTask, который будет выполнять асинхронную операцию и возвращать результат выполнения:
В качестве аргументов метод ILoadingTask.Do() будет принимать делегат обратного вызова, в который будет передаваться результат выполнения задачи LoadingResult:
А сам класс загрузки приложения будет выглядеть так:
В классе загрузчика появились события OnLoadingCompleted и OnLoadingFailed, на них можно будет подписаться и показать сообщение на UI, если произошла ошибка:
Теперь для каждой задачи сделаем свою реализацию ILoadingTask:
Также можно прикрутить прогресс загрузки, добавив параметр веса к каждой задаче:
Обратите внимание, что реализация LoadingTask должна получить зависимости на необходимые компоненты системы через конструктор или метод пост-инъекции. На Zenject это будет выглядеть примерно так:
Еще дополнительно хотел бы отметить, что при такой реализации можно применить GoF паттерн компоновщик и сделать композитные таски:
Выводы
Таким образом, используя интерфейс ILoadingTask, система загрузки становится более гибкой, поддерживаемой и масштабируемой. У разработчика появляется возможность настраивать древо загрузки приложения, используя как атомарные так и композитные таски, а результаты загрузки можно выводить на экран.