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,将其设为 title
或 creationDate
或任何对象独有的属性。
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 应用于满足特定条件的条目?的主要内容,如果未能解决你的问题,请参考以下文章