PoolSystem
Namespace: Vortex.Unity.UI.PoolSystem
Сборка: ru.vortex.unity.ui.misc
Назначение
Пул объектов с data-ключами и переиспользованием. Pool управляет экземплярами PoolItem, обеспечивая создание, переиспользование и деактивацию элементов.
Возможности:
- Создание/переиспользование элементов по data-ключу
- Деактивация с возвратом в очередь свободных
- Типизированный доступ к данным через
IDataStorage - Событие
OnUpdateLinkпри смене данных
Вне ответственности:
- Логика отображения элементов (реализуется в наследниках
PoolItem) - Предзагрузка пула
Зависимости
| Зависимость | Назначение |
|---|---|
Vortex.Core.System |
IDataStorage — интерфейс хранилища данных |
Vortex.Core.Extensions.LogicExtensions |
AddNew — добавление в индекс пула |
Vortex.Unity.AppSystem |
TimeController.RemoveCall — снятие отложенных вызовов |
| Odin Inspector | [ShowInInspector] — отображение данных в Editor |
Архитектура
PoolSystem/
├── Pool.cs # Менеджер пула (MonoBehaviour)
└── PoolItem.cs # Контейнер элемента (MonoBehaviour, IDataStorage)
Pool
MonoBehaviour-менеджер. Хранит:
PoolItem preset— шаблон для инстанцированияDictionary<object, PoolItem> _index— активные элементы по data-ключуQueue<PoolItem> _freeItems— очередь свободных элементов
При Awake собирает существующие дочерние PoolItem в очередь свободных.
PoolItem
MonoBehaviour-контейнер, связывающий данные с визуалом. Реализует IDataStorage. Хранит List<object> _data с FIFO-поиском по типу.
API
Pool
pool.AddItem(model, intData); // params object[] — множественные данные
pool.AddItem(data); // создать/переиспользовать
pool.AddItemBefore(data); // вставить в начало (SetAsFirstSibling)
var item = pool.AddItem<MyView>(data); // с приведением к MonoBehaviour
var existing = pool.GetItem<MyView>(data); // получить по ключу (или null)
pool.RemoveItem(data); // деактивировать, вернуть в очередь
pool.RemoveByCallback(key => key is MyType); // удалить все элементы по условию
pool.Clear(); // деактивировать все, вернуть в очередь
При передаче params object[] массив используется как ключ в _index, а PoolItem.MakeLink распаковывает его: каждый элемент массива добавляется в _data отдельно, обеспечивая GetData<T>() по любому из переданных типов.
PoolItem
var model = poolItem.GetData<MyModel>(); // FIFO-поиск по типу
poolItem.OnUpdateLink += OnDataChanged; // событие обновления данных
Контракт
Вход
PoolItem preset— шаблон в Inspectorobject data— ключ и данные элемента
Выход
- Активный
PoolItemс привязанными данными OnUpdateLink— событие при смене данных
Гарантии
AddItemс существующим ключом возвращает существующий элементRemoveItemвозвращает элемент в очередь, не уничтожаетRemoveByCallbackитерирует по снимку ключей — безопасен при модификации_indexво время обходаClearдеактивирует все элементы и возвращает в очередь свободных
Граничные случаи
| Ситуация | Поведение |
|---|---|
AddItem() с существующим ключом |
Возврат существующего элемента |
RemoveItem() с несуществующим ключом |
Тихий пропуск |
GetItem() с несуществующим ключом |
Возвращает null |
| Очередь свободных пуста | Инстанцирование нового из preset |
Clear() |
Все элементы деактивируются и возвращаются в очередь свободных, индекс очищается |
RemoveByCallback() — callback не совпал ни с одним ключом |
Ничего не удаляется |
PoolItem.GetData<T>() — тип не найден |
Возвращает null |