PDA

Просмотр полной версии : Отследить добавление/удаление элементов вектора


Appleman
09.05.2018, 00:26
Друзья!

Имею вектор. Хочу, чтобы изменение его элементов (любым способом) вызывало событие. Как это можно наиболее бескровно реализовать?

Спасибо.

Tails
09.05.2018, 12:42
Написать класс - обёртку. Композиция будет лучше наследования.

СлаваRa
09.05.2018, 13:15
https://github.com/SlavaRa/blooddy/blob/master/blooddy_core/src/by/blooddy/core/utils/ArrayEventDispatcher.as

@Tails, про композицию напомнило:
- vim лучше чем любая IDE!
- чем лучше?
- чем любая IDE

DEVORON
09.05.2018, 15:29
Еще, как вариант, можете попробовать VectorListModel из пакета AsWing. Но там работа идёт с массивом

Zebestov
09.05.2018, 23:54
Appleman, а ты уверен, что хочешь именно событие по каждому чиху, а не флаг, который когда дело доходит до обработки вектора, сообщает, что с момента последнего запроса вектор 1 или 100500 раз поменялся? Как правило логика может щелкать данными существенно чаще, чем эти данные нужно, например, отображать.

Appleman
10.05.2018, 11:16
СлаваRa, спасибо, круто!

Zebestov, да я сам ещё до конца не решил, чего на самом деле хочу :) Это вектор основных персонажей в Модели. С одной стороны, его не часто придётся дёргать по части изменения, но постоянно и многократно перебирать методом for each.

Нужно, чтобы добавление либо удаление элемента не оставалось незамеченным, но при этом не терялась способность иметь удобный доступ к элементам и перебирать их. Пока в Модели написал методы addCharacter2Pool(ch: Character) и removeCharacterFromPool(ch: Character). Но, боюсь, сам же забуду о необходимости пользоваться данными методами и зафигачу _characterPool.push(character) и буду рвать на жопе волосы, почему всё перестало работать нормально...

caseyryan
10.05.2018, 13:01
А тебе что вообще нужно делать с этими массивами? Нужен доступ по индексу к элементам? Могут ли элементы в массиве повторяться?
Подумай над этим. Ведь есть же другие типы коллекций. Например хэшкарты, в которых отсутствует индексатор, но зато элементы находятся за константное время O(1), без перебора. В as3 Dictionary и Object работают как хешкарты. Но в них ключи уникальны.

Zebestov
10.05.2018, 13:40
Но, боюсь, сам же забуду о необходимости пользоваться данными методами и зафигачу _characterPool.push(character)...

А ты не забывай )) бо все ты правильно сделал.

Tails
11.05.2018, 02:08
@Tails, про композицию напомнило:
- vim лучше чем любая IDE!
- чем лучше?
- чем любая IDE

Да, забавно получилось) Но я так и подумал, что человеку нужна конструкция более высокого уровня (Список игровых объектов), а не просто низкоуровневый вектор с уведомлением. Поэтому.