0

我有一个 Flex 应用程序,它有一个 AdvancedDataGrid,它在树中显示分层数据。我目前将这些数据存储在 XML 中,并且大约每秒更新一次。这在一段时间内运行良好,但我必须存储和更新的数据量最近有所增加,并且它正在减慢应用程序的速度,以至于它变得无法使用并经常崩溃。

所以我需要一种更有效的方式来存储、更新和访问这些数据。主要要求是我用来存储数据的任何东西都需要能够转换为 HierarchicalData 对象,我可以将其用作我的 AdvancedDataGrid 的数据提供者(以启用树显示)。

我正在考虑尝试使用 ArrayCollection,因为这是 Adob​​e 提供的示例 ( http://livedocs.adobe.com/flex/3/html/help.html?content=advdatagrid_06.html ) 中显示的唯一其他类型。这会比使用 XML 更有效吗?是否有另一种数据类型可能比其中任何一种访问速度更快?

4

1 回答 1

0

每当我对数据结构执行许多更新或搜索操作时,我总是将任何串行数据(xml、json 等)转换为强类型模型类。这将允许数据操作尽快执行。AdvancedDataGrid 使用 HierarchicalData 类来描述结构,因此您只需要确保您的模型符合该结构(或创建自定义描述符)。

例如:

public class MyBranchNode extends EventDispatcher
{
    public function MyBranchNode(data:XML, target:IEventDispatcher = null)
    {
        super(target);

        setMemento(data);
    }

    public var children:Array;

    private var _label:String;

    [Bindable(event = "labelChange")]
    public function get label():String
    {
        return _label;
    }

    public function set label(value:String):void
    {
        if(_label == value)
            return;

        _label = value;
        this.dispatchEvent(new Event("labelChange"));
    }

    /**
     * Parse your XML into into binary data
     */
    private function setMemento(data:XML):void
    {
        this.label = data.label;

        for each(var child:XML in data.children())
        {
            if(this.children == null)
                this.children = [];

            this.children.push(new MyLeafNode(child));
        }
    }
}



public class MyLeafNode extends EventDispatcher
{
    public function MyLeafNode(data:XML, target:IEventDispatcher = null)
    {
        super(target);

        setMemento(data);
    }

    private var _label:String;

    [Bindable(event = "labelChange")]
    public function get label():String
    {
        return _label;
    }

    public function set label(value:String):void
    {
        if(_label == value)
            return;

        _label = value;
        this.dispatchEvent(new Event("labelChange"));
    }

    /**
     * Parse your XML into into binary data
     */
    private function setMemento(data:XML):void
    {
        this.label = data.label;
    }
}
于 2013-11-05T20:49:02.483 回答