0

ツリーに階層データを表示する AdvancedDataGrid を持つ Flex アプリケーションがあります。現在、このデータを XML で保存しており、約 1 秒ごとに更新されています。これはしばらくの間うまく機能していましたが、保存および更新する必要があるデータの量が最近増加し、アプリケーションの速度が低下し、使用できなくなり、頻繁にクラッシュするようになりました。

そのため、このデータをより効率的に保存、更新、およびアクセスする方法が必要です。主な要件は、データを格納するために使用するものはすべて、(ツリー表示を有効にするために) AdvancedDataGrid のデータ プロバイダーとして使用できる HierarchicalData オブジェクトに変換できる必要があるということです。

Adobeが提供する例( http://livedocs.adobe.com/flex/3/html/help.html?content=advdatagrid_06.html )に示されている唯一の他のタイプであるため、ArrayCollectionを試すことを考えています。これは 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 に答える