严重沮丧的尝试想出一种动态排序UICollectionView项目的方法。
第一次加载UICollectionView时,会运行另一种执行查询的方法。此方法一次只加载4个项目,并且总是与我的分页一起使用以加载4.使用此设置排序更加令人困惑,因为我一次只能对4个项目进行排序。
所以我在尝试对UICollectionView项进行排序时创建了另一种执行查询的方法。
我有一个UIPickerView,允许客户对购物项目进行排序:
点击完成按钮后,会执行查询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。
请帮我看看我出错的地方或者至少展示出更好的方法。
答案 0 :(得分:3)
我认为这里存在一个误解,无论是你对收集的看法,还是我的困难所在。
如果我理解正确,你担心如果你有1000个项目的数组,它们都会被加载到集合视图中。这是不正确的。集合视图中的单元格是按需动态加载的。无论何时要显示单元格,都要求数据源提供该单元格的信息。信息永远不会在任何时候一次性加载。如果屏幕上最多可以显示8个单元格,则最多可以在内存中加载8个单元格。就是这样。当用户滚动时,单元格将被回收并用于显示下一个项目,依此类推。
所以有一些事情。首先,您无需优化分页数据。如果需要在页面中加载数据,则应该为集合提供许多项目,然后在用户滚动时加载和卸载页面。如果信息不大,您可以加载所有信息。如果数据标准化良好,则1000行听起来不像很多信息 。其次,你的查询返回1000个项目 - 不用担心,集合视图只会为它可以显示的内容加载必要的单元格,仅此而已。它将重用先前的单元格以用于后续数据。