在as3中获取Objects值的最快方法

时间:2010-08-22 03:29:18

标签: flex actionscript-3 optimization object arraycollection

好的,所以我发誓这个问题应该到处都是,但不是。

我有一个值对象,里面有很多getter / setter。它不是一个动态的类。我迫切需要搜索一个充满它们的ArrayCollection。搜索范围涵盖所有字段,因此我将使用大约13种不同类型的VO。

我已经尝试过ObjectUtil.toString()并且工作正常但除此之外它还很慢。有20个属性要返回,ObjectUtil.toString()会在输出中添加一堆垃圾,更不用说代码开始时很慢。

flash.utils.describeType()更糟糕。

我很高兴听到我错过了一些明显的东西。

更新: 我最终得到了Juan的代码以及我用于搜索的过滤算法并创建了ArrayCollectionX。这意味着我现在使用的每个ArrayCollection都会处理它自己的过滤器。我可以搜索AC中项目的各个属性,或者使用Juan的代码来处理像冠军一样的完整集合搜索。与使用外部滤波器的相同解决方案相比,滞后可忽略不计。

1 个答案:

答案 0 :(得分:3)

如果我正确理解您的问题,您需要的是为某些对象定义的getter列表。据我所知,你必须使用describeType这样的东西(我很确定ObjectUtils使用这种方法)。

如你所知,调用describeType会很慢。但是对于只有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;
}