NSFetchedResultsController 仅将 NSSortDescriptor 应用于满足特定条件的条目?

Posted

技术标签:

【中文标题】NSFetchedResultsController 仅将 NSSortDescriptor 应用于满足特定条件的条目?【英文标题】:NSFetchedResultsController applying NSSortDescriptor only to entries where certain condition is met? 【发布时间】:2014-01-03 11:29:35 【问题描述】:

我正在设置NSFetchedResultsController。我的实体有一个名为“hasRight”(bool)的属性和另一个名为“sortOrder”(int)的属性。如果条目的“hasRight”为真,则还有一个 sortOrder,它是一个整数,可用。另一方面,如果“hasRight”为假,则 sortOrder 始终为 0(零)。目前我的代码如下所示:

- (NSFetchedResultsController *)setupFetchedResultsController:(JournalCategory*) journalCategory

    NSManagedObjectContext *managedObjectContext = [[ConfigurationManager sharedInstance] mainManagedObjectContext];

    NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
    [fetch setEntity:[NSEntityDescription entityForName:@"Journal" inManagedObjectContext:managedObjectContext]];

    NSSortDescriptor *sortDescriptorHasRight = [[NSSortDescriptor alloc] initWithKey:@"hasRight" ascending:NO];
    NSSortDescriptor *sortDescriptorSortOrder = [[NSSortDescriptor alloc] initWithKey:@"sortOrder" ascending:YES];
    [fetch setSortDescriptors:[NSArray sortDescriptorHasRight, sortDescriptorSortOrder, nil]];

    predicate = [NSPredicate predicateWithFormat:@"journalCategory == %@", journalCategory];
    [fetch setPredicate:predicate];

    return [[NSFetchedResultsController alloc] initWithFetchRequest:fetch managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];

此代码根据“hasRight”对我的条目进行排序,因此该标志设置为 true 的条目显示在“hasRight”设置为 false 的条目之前。之后,根据属性“sortOrder”对条目进行排序。这适用于所有“hasRight”设置为 true 的条目,因为每个条目都有一个唯一的“sortOrder”。

问题是“hasRight”设置为 false 的所有条目的“sortOrder”为 0。我在 UICollectionView 中显示此 Fetch 的数据。发生的情况是,每次重新加载 UICollectionView 中的数据时,UICollectionView 再次获取高于 NSFetchedResultsController 并且所有“hasRight”为假的条目都被随机排序,因为所有条目对于“sortOrder”具有相同的值(0) ”。因此,每次重新加载UICollectionView 时,所有“hasRight”设置为 false 的单元格都会以随机顺序重新排列。

我想做的是将第二个NSSortDescriptor (sortDescriptorSortOrder) 仅应用于“hasRight”设置为 true 的所有条目。 NSFetchedResultsController 甚至可以做到这一点,如果可以,谁能告诉我怎么做?

【问题讨论】:

【参考方案1】:

你想要的都是不可能的。但即使有可能,它也不能解决你的问题。因为没有第二个 sortDescriptor,具有 hasRight==NO 的对象仍然没有排序,并且将以随机方式返回。

您需要第三个 sortDescriptor,将其设为 titlecreationDate 或任何对象独有的属性。 hasRight=YES 的对象不会受到第三个 sortDescriptor 的影响,因为第二个 sortDescriptor (sortOrder) 对于每个对象来说已经是唯一的。

如果您没有其他唯一属性,您也可以将 sortOrder 用于 hasRight=NO 对象。因为您的第一个 sortDescriptor 是 hasRight 所有具有 hasRight=NO 的对象仍会稍后出现。

例如,如果您按 hasRight 和 sortOrder 排序,这是结果顺序

hasRight | sortOrder
YES      | 1
YES      | 2
YES      | 3
NO       | 1
NO       | 2
NO       | 3

【讨论】:

感谢您的回答。你的观点是有道理的,即使我提出的方法可行,hasRight==NO 的顺序仍然是随机的。我所做的只是创建了第三个 sortDescriptor,它根据 title 属性对条目进行排序。

以上是关于NSFetchedResultsController 仅将 NSSortDescriptor 应用于满足特定条件的条目?的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?