apache-flex - 在 as3 中获取对象值的最快方法

标签 apache-flex actionscript-3 optimization object arraycollection

好吧,所以我发誓这个问题应该无处不在,但事实并非如此。

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

我尝试过 ObjectUtil.toString() ,效果很好,但速度慢得要命。有 20 个属性需要返回,并且 ObjectUtil.toString() 在输出中添加了一堆垃圾,更不用说代码一开始就很慢。

flash.utils.describeType() 更糟糕。

我会很高兴听到我遗漏了一些明显的东西。

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

最佳答案

如果我正确理解你的问题,你想要的是为某些对象定义的 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;
}

关于apache-flex - 在 as3 中获取对象值的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3540003/

相关文章:

actionscript-3 - 如何在AS3中获取当月的开始日期和结束日期

c++ - 尝试制作 AMF3 数据包

actionscript-3 - 如何在 Flex 中更改模态透明度

ios - iOS 版 Air : included files directory path

c - 注释是否消耗内存和/或使用周期?

database - 此优化是否始终有效

python - BlazeDS Livecycle Data Services 有什么作用,而 PyAMF 或 RubyAMF 之类的东西不能做什么?

apache-flex - 从自定义容器向Flex/Flash提供原始MP3/AAC数据

apache-flex - 如何批量将swf转成flv

python - 在 Python 中对导数有约束的多项式的最小二乘近似