gpt4 book ai didi

ios - 使用 Fetch Results Controller 对 Core Data 中的单元格重新排序

转载 作者:行者123 更新时间:2023-12-01 18:26:34 26 4
gpt4 key购买 nike

我正在研究如何使用 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,我认为这是不可行的。有没有其他方法可以执行此过程

问候
兰 git

最佳答案

为什么你认为你需要重新计算索引号?

这些项目根据您应用的排序顺序排列。

如果您提供升序排序,并提供一个数字,那么您将获得正确的排序。您不需要的是用于订购商品的数字与数组中商品的索引之间的直接对应关系。例如:如果您的订货号是

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

所以。使用排序索引没有任何问题。它不需要是整数,因此当您删除一个项目时,您不必重新计算所有索引。

现在,这些浮点数很可能会变得笨拙,但您可以在应用程序停机期间或在用户希望进行一些设置的更新期间运行定期重新编号。

关于ios - 使用 Fetch Results Controller 对 Core Data 中的单元格重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13197159/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com