【问题标题】:Adobe Air/Flex filtering large datasetsAdobe Air/Flex 过滤大型数据集
【发布时间】:2010-12-02 12:53:41
【问题描述】:

您好,我有一个 Air 应用程序,它下载大约 100`000 个对象的数据集并将这些对象放入 ArrayCollection。

我想在整个应用程序的多个屏幕中对数据集应用各种过滤器。 如果我制作多个集合副本,我有点担心可能出现的性能问题。但是,如果我不复制集合,则应用的任何过滤器都会反映在所有屏幕中,这不是我需要的行为。

为这个大型数据集合提供多个视图的最佳方式是什么? 有没有人有过这种情况的经验。 非常感谢任何帮助。

【问题讨论】:

    标签: apache-flex air


    【解决方案1】:

    您可以使用一个类作为原始 ArrayCollection 和存储在其中的数据的代理。您可以在代理上设置过滤器功能,并让代理将其大部分其他功能委托给引用的 ArrayCollection。您可能可以从子类化 ListCollectionView 开始。

    【讨论】:

      【解决方案2】:

      您可以拥有包含原始数据的单个数组,但也可以在同一数组上拥有不同的 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>
      

      【讨论】:

        【解决方案3】:

        我猜有两种选择:

        1. 不用担心性能:即使您有多个集合,它们都会通过引用指向相同的数据对象。只需创建新的 ArrayCollections 并将对象作为数组传入。然后,您可以将过滤器应用于各个集合。

        2. 通过为每个视图应用过滤器来急切地处理过滤器,然后将结果复制到新的 ArrayCollection 中。一旦你过滤了一个集合,就创建一个新的集合,作为源filteredCollection.toArray()。与上述相同:集合将包含对对象的引用,而不是值副本。

        【讨论】:

          【解决方案4】:

          我有完全相同的情况并开发了这个工具:surflex。它允许非常快速地选择、过滤和加入集合。

          【讨论】:

            猜你喜欢
            • 2010-11-23
            • 1970-01-01
            • 2014-08-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-05
            • 2013-06-12
            • 1970-01-01
            相关资源
            最近更新 更多