使用 Fetch Results Controller 对 Core Data 中的单元格重新排序
Posted
技术标签:
【中文标题】使用 Fetch Results Controller 对 Core Data 中的单元格重新排序【英文标题】:Reorder of cells in CoreData using Fetch ResultsController 【发布时间】:2012-11-02 14:25:23 【问题描述】:我正在研究如何使用 FRC 对 CoreData 中的单元格进行重新排序,我遇到了许多建议使用 order 属性并相应地更新它的帖子,下面是一个这样的代码
在插入新对象时,我必须设置显示顺序并根据其递增
这是它的代码
- (void)insertNewObject
Test *test = [NSEntityDescription insertNewObjectForEntityForName:@"Test" inManagedObjectContext:self.managedObjectContext];
NSManagedObject *lastObject = [self.controller.fetchedObjects lastObject];
float lastObjectDisplayOrder = [[lastObject valueForKey:@"displayOrder"] floatValue];
[test setValue:[NSNumber numberWithDouble:lastObjectDisplayOrder + 1.0] forKey:@"displayOrder"];
- (void)tableView:(UITableView *)tableView
moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath
toIndexPath:(NSIndexPath *)destinationIndexPath;
NSMutableArray *things = [[fetchedResultsController fetchedObjects] mutableCopy];
// Grab the item we're moving.
NSManagedObject *thing = [[self fetchedResultsController] objectAtIndexPath:sourceIndexPath];
// Remove the object we're moving from the array.
[things removeObject:thing];
// Now re-insert it at the destination.
[things insertObject:thing atIndex:[destinationIndexPath row]];
// All of the objects are now in their correct order. Update each
// object's displayOrder field by iterating through the array.
int i = 0;
for (NSManagedObject *mo in things)
[mo setValue:[NSNumber numberWithInt:i++] forKey:@"displayOrder"];
[things release], things = nil;
// [managedObjectContext save:nil];
NSError *error = nil;
if (![managedObjectContext save:&error])
NSString *msg = @"An error occurred when attempting to save your user profile changes.\nThe application needs to quit.";
NSString *details = [NSString stringWithFormat:@"%@ %s: %@", [self class], _cmd, [error userInfo]];
NSLog(@"%@\n\nDetails: %@", msg, details);
// re-do the fetch so that the underlying cache of objects will be sorted
// correctly
if (![fetchedResultsController performFetch:&error])
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
但是假设我有 100 个项目,我从中间删除任何一个项目,然后我必须重新计算 displayOrder,我认为这是不可行的。有没有其他方法可以完成这个过程
问候 兰吉特
【问题讨论】:
有人能帮帮我吗 【参考方案1】:您认为为什么需要重新计算索引号?
项目根据您应用的排序顺序排列。
如果您提供升序排序,并提供一个数字,那么您将获得正确的排序。您不需要的是用于订购商品的数字与数组中商品的索引之间的直接对应关系。例如:如果您的订货号是
1 2 3 4
然后,当您获取它们并对其进行排序时,它们将按此顺序显示。但是如果订购号不同,它们仍然会以相同的顺序出现。
1 3 5 7
没有数字也没关系,因为它们只用于排序,而不是记录位置。
现在,假设您有 4 个根据索引排序的项目。
1 2 3 4
现在删除第二项
1 3 4
您少了 1 件商品,但它们的顺序仍然相同。假设您在末尾添加了一个项目:
1 3 4 5
现在假设您想将最后的项目移动到第三个位置。这是你问自己另一个问题的地方:为什么排序索引必须是整数?如果你使用浮点数,你可以看到很容易计算一个新的索引作为前数和后数之间的中点。因此,将最后的项目移动到第三个位置后,排序索引将如下所示:
1.0 3.0 3.5 4.0
在第二个位置添加一个数字怎么样。在这种情况下,中点很容易计算:
1.0 2.0 3.0 3.5 4.0
所以。使用排序索引没有任何问题。它不需要是整数,所以当你删除一个项目时,你不必重新计算所有索引。
现在,这些浮点数可能会变得难以控制,但您可以在应用停机期间或在用户希望进行一些设置的更新期间运行定期重新编号。
【讨论】:
非常感谢@Abizern 向我解释了这个概念。 如果我明白了,你的回答,这是我应该做的,首先,我应该采用一个浮点类型的 displayOrder 属性,当插入每个对象时,该属性应该递增。 是的,这就是我的意思 我已经修改了,请检查上面的insertObject函数以上是关于使用 Fetch Results Controller 对 Core Data 中的单元格重新排序的主要内容,如果未能解决你的问题,请参考以下文章
使用 fetch、cors 时如何从 json API 获取属性?