如何使用项目的价格对UICollectionView项目进行排序/订购?

时间:2014-04-29 15:38:29

标签: ios objective-c sorting uicollectionview parse-platform

严重沮丧的尝试想出一种动态排序UICollectionView项目的方法。

第一次加载UICollectionView时,会运行另一种执行查询的方法。此方法一次只加载4个项目,并且总是与我的分页一起使用以加载4.使用此设置排序更加令人困惑,因为我一次只能对4个项目进行排序。

所以我在尝试对UICollectionView项进行排序时创建了另一种执行查询的方法。

我有一个UIPickerView,允许客户对购物项目进行排序:

enter image description here

点击完成按钮后,会执行查询parse.com:

- (void)pickerDoneButtonTapped
{
    NSLog(@"Picker done button pressed");
     [_thisController performQueryForFilter];
}

根据选择器中的哪一行返回已排序对象的NSArray:

-(PFQuery *)queryForCollection
{
    PFQuery *query = [PFQuery queryWithClassName:@"Garments"];
        // check what the selectedRowInFilterPicker currently is
        // then add that task to the query    

        if (_selectedRowInFilterPicker == 0) {
            NSLog(@"ORDER BY RECOMMENDED");
        } else if (_selectedRowInFilterPicker == 1) {
            NSLog(@"ORDER BY NEWEST ITEMS");
        } else if (_selectedRowInFilterPicker == 2) {
            NSLog(@"ORDER BY DESCENDING USING PRICE");
            [query orderByDescending:@"price"];
        } else if (_selectedRowInFilterPicker == 3) {
            NSLog(@"ORDER BY ASCENDING USING PRICE");
            [query orderByAscending:@"price"];
        }
    return query;
}

这是在点击完成按钮时触发的performQueryForFilter方法:

- (void)performQueryForFilter
{
    NSLog(@"PERFORM QUERY FOR FILTER");
    PFQuery *query = self.queryForCollection;

    [self objectsWillLoad];

    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {  
        self.isLoading = NO;
        if (error)
            self.objects = [NSArray new];
        else {
            if (_paginationEnabled && !_isRefreshing) {
                //add a new page of objects
                NSMutableArray *mutableObjects = [NSMutableArray arrayWithArray:self.objects];
                [mutableObjects addObjectsFromArray:objects];
                self.objects = [NSArray arrayWithArray:mutableObjects];
            }
            else {
                self.objects = objects;
            }
        }      
        [self objectsDidLoad:error];
    }];
}

这在一定程度上正常工作。我在UIPickerView中进行了选择,然后完成了。现在,在重新加载我的UICollectionView中的数据之后,我有2个问题。

  • 1。正确排序的对象的整个NSArray现在是我的dataSource的数据,因此在重新加载数据后,所有这些对象都会添加到UICollectionView中。

    < / LI>
  • 2。首次加载UICollectionView时默认显示的上一个单元格仍然存在。所以新添加的对象刚刚添加到下面。

现在我的数据库中最多有9行。现在让我们说将来有1000个。每次用户想要从低到高或从高到低的选项对项目进行排序时,我不能加载1000行并添加到UICollectionView。

请帮我看看我出错的地方或者至少展示出更好的方法。

1 个答案:

答案 0 :(得分:3)

我认为这里存在一个误解,无论是你对收集的看法,还是我的困难所在。

如果我理解正确,你担心如果你有1000个项目的数组,它们都会被加载到集合视图中。这是不正确的。集合视图中的单元格是按需动态加载的。无论何时要显示单元格,都要求数据源提供该单元格的信息。信息永远不会在任何时候一次性加载。如果屏幕上最多可以显示8个单元格,则最多可以在内存中加载8个单元格。就是这样。当用户滚动时,单元格将被回收并用于显示下一个项目,依此类推。

所以有一些事情。首先,您无需优化分页数据。如果需要在页面中加载数据,则应该为集合提供许多项目,然后在用户滚动时加载和卸载页面。如果信息不大,您可以加载所有信息。如果数据标准化良好,则1000行听起来不像很多信息 。其次,你的查询返回1000个项目 - 不用担心,集合视图只会为它可以显示的内容加载必要的单元格,仅此而已。它将重用先前的单元格以用于后续数据。