【问题标题】:Fastest way to get an Objects values in as3在 as3 中获取对象值的最快方法
【发布时间】:2010-08-22 03:29:18
【问题描述】:

好的,我发誓这个问题应该到处都是,但事实并非如此。

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

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

flash.utils.describeType() 更糟糕。

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

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

【问题讨论】:

    标签: apache-flex actionscript-3 optimization object arraycollection


    【解决方案1】:

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

    【讨论】:

    • 绝对精彩!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多