Самый быстрый способ получить значения объектов в as3 - PullRequest
2 голосов
/ 22 августа 2010

Хорошо, я клянусь, этот вопрос должен быть повсюду, но его нет.

У меня есть объект значения, внутри много геттеров / сеттеров.Это не динамический класс.И мне отчаянно нужно искать коллекцию ArrayCollection, заполненную ими.Поиск охватывает все поля, так что есть около 13 различных типов виртуальных организаций, с которыми я буду делать это.

Я пробовал ObjectUtil.toString (), и это прекрасно работает, и все, но это медленно, как ад,Есть 20 свойств, которые нужно вернуть, и ObjectUtil.toString () добавляет кучу мусора к выводу, не говоря уже о том, что код начинается медленно.

flash.utils.describeType () еще хуже.

Я буду рад услышать, что мне не хватает чего-то очевидного.

ОБНОВЛЕНИЕ: я закончил тем, что взял код Хуана вместе с алгоритмом фильтра, который я использую для поиска, и создал ArrayCollectionX.Это означает, что каждая ArrayCollection, которую я использую сейчас, обрабатывает свои собственные фильтры.Я могу искать по отдельным свойствам предметов в АС или с помощью кода Хуана он обрабатывает поиск всей коллекции как чемпион.Было незначительное отставание по сравнению с тем же решением с внешними фильтрами.

1 Ответ

3 голосов
/ 22 августа 2010

Если я правильно понимаю вашу проблему, вам нужен список геттеров, определенных для определенных объектов.Насколько я знаю, вам придется использовать descriptionType для чего-то подобного (я почти уверен, что ObjectUtils использует этот метод под капотом).

Как вы заметили, вызов метода descriptionType будет происходить медленно.Но только для 13 типов это не должно быть проблематичным, я думаю.Поскольку эти типы не являются динамическими, вы знаете, что их свойства фиксированы, поэтому вы можете получить эти данные один раз и кэшировать их.Вы можете создать кеш заранее или по мере появления новых типов.

Вот простой способ сделать это в коде:

private var typePropertiesCache:Object = {};

private function getPropertyNames(instance:Object):Array {
    var className:String = getQualifiedClassName(instance);
    if(typePropertiesCache[className]) {
        return typePropertiesCache[className];
    }
    var typeDef:XML = describeType(instance);
    var props:Array = [];
    for each(var prop:XML in typeDef.accessor.(@access == "readwrite" || @access == "readonly")) {
        props.push(prop.@name);
    }   
    return typePropertiesCache[className] = props;
}
...