2009-09-30 5 views
0

Привет, У меня есть приложение Air, которое загружает набор данных около 100`000 объектов и помещает объекты в ArrayCollection.Adobe Air/Flex фильтрация больших наборов данных

Я хотел бы применить различные фильтры к набору данных на многочисленных экранах в приложении. Я немного беспокоюсь о возможных проблемах с производительностью, если я делаю несколько копий коллекции. Однако, если я не копирую коллекцию, любые применяемые фильтры будут отражены на всех экранах, и это не то поведение, в котором я нуждаюсь.

Что было бы лучшим способом дать несколько представлений об этой большой коллекции данных? Имеет ли кто-нибудь опыт такого сценария. Любая помощь очень ценится.

ответ

1

Вы можете использовать класс, который действует как прокси для оригинального ArrayCollection и хранимых в нем данных. Вы можете установить функцию фильтра на прокси-сервере и передать прокси-сервер большинству своих других функций на указанный массив ArrayCollection. Возможно, вы можете начать с подклассификации ListCollectionView для этого.

1

Вы можете иметь одиночный массив с исходными данными, но также иметь различные подклассы ArrayCollections на одном массиве. Таким образом, вы можете применить любой фильтр к экземплярам ArrayCollections.

В качестве примера:

<?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

Я предполагаю, что есть 2 варианта:

  1. не беспокоиться о производительности: даже если у вас есть несколько коллекций, все они будут указывать на те же данные объекты через ссылки. Просто создайте новые массивы ArrayCollections и передайте объекты в виде массива. Затем вы можете применить фильтры к отдельным коллекциям.

  2. обрабатывает фильтры с нетерпением, применяя фильтр для каждого вида, а затем копирует результат в новый массив ArrayCollection. После того как вы отфильтровали коллекцию, создайте новую с помощью source filterCollection.toArray(). То же самое относится к вышеперечисленному: коллекции будут содержать ссылки на объекты, а не на копии.

1

У меня точно такая же ситуация и разработан этот инструмент: surflex. Он позволяет очень быстро выбирать, фильтровать и вступать в коллекцию.

Смежные вопросы