2009-09-30 6 views
0

Salut J'ai une application Air qui télécharge un ensemble de données d'environ 100 000 objets et place les objets dans un ArrayCollection.Adobe Air/Flex filtrant de grands ensembles de données

Je voudrais appliquer divers filtres à l'ensemble de données dans de nombreux écrans dans toute l'application. Je suis un peu inquiet des problèmes de performance possibles si je fais plusieurs copies de la collection. Cependant, si je ne copie pas la collection, les filtres appliqués seront reflétés dans tous les écrans et ce n'est pas le comportement dont j'ai besoin.

Quelle serait la meilleure façon de donner plusieurs vues de cette grande collection de données? Quelqu'un at-il eu une expérience avec ce genre de scénario. Toute aide très appréciée.

Répondre

1

Vous pouvez utiliser une classe qui agit comme un proxy pour l'ArrayCollection d'origine et les données stockées dans celle-ci. Vous pouvez définir la fonction de filtre sur le proxy et demander au proxy de déléguer la plupart de ses autres fonctionnalités au ArrayCollection référencé. Vous pouvez probablement commencer par sous-classer ListCollectionView pour ce faire.

1

Vous pouvez avoir une matrice unique avec des données d'origine mais également des ArrayCollections différentes sous-jacentes sur la même matrice. Ainsi, vous pouvez appliquer n'importe quel filtre aux instances de ArrayCollections.

A titre d'exemple:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="vertical" 
    creationComplete="init();"> 
<mx:Script> 
    <![CDATA[ 
    import mx.collections.ArrayCollection; 
    private var buffer:Array; 

    [Bindable] 
    private var listData1:ArrayCollection; 

    [Bindable] 
    private var listData2:ArrayCollection; 

    private function init():void 
    { 
    buffer = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 

    listData1 = new ArrayCollection(); 
    listData1.source = buffer; 

    listData2 = new ArrayCollection(); 
    listData2.source = buffer; 

    listData1.filterFunction = filter1 
    listData2.filterFunction = filter2; 

    listData1.refresh(); 
    listData2.refresh(); 
    } 

    private function filter1(item:Object):Boolean 
    { 
    var i:Number = Number(item); 

    if (i >= 5) 
    { 
    return true; 
    } 

    return false; 
    } 

    private function filter2(item:Object):Boolean 
    { 
    var i:Number = Number(item); 

    if (i <= 5) 
    { 
    return true; 
    } 

    return false; 
    } 
    ]]> 
</mx:Script> 
<mx:HBox> 
    <mx:List id="list1" 
    dataProvider="{listData1}"/> 
    <mx:List id="list2" 
    dataProvider="{listData2}"/> 
</mx:HBox> 
</mx:Application> 
1

Je suppose qu'il ya 2 options:

  1. ne vous inquiétez pas sur les performances: même si vous avez plusieurs collections, ils seront tous points aux mêmes données objets via des références. Créez simplement de nouvelles ArrayCollections et transmettez les objets sous forme de tableau. Vous pouvez ensuite appliquer des filtres aux collections individuelles.

  2. traitez les filtres avec impatience en appliquant un filtre pour chaque vue, puis copiez le résultat dans une nouvelle ArrayCollection. Une fois que vous avez filtré une collection, créez-en une nouvelle avec comme source filterCollection.toArray(). Il en va de même pour ce qui précède: les collections contiendront des références à des objets et non des copies de valeur.

1

J'ai exactement la même situation et j'ai développé cet outil: surflex. Il permet de sélectionner, filtrer et joindre des collections très rapidement.

Questions connexes