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

时间:2014-01-03 11:29:35

标签: objective-c core-data nspredicate nsfetchedresultscontroller nssortdescriptor

我正在设置NSFetchedResultsController。我的实体有一个名为“hasRight”(bool)的属性和另一个名为“sortOrder”(int)的属性。如果条目的“hasRight”为真,则还有一个sortOrder,它是一个整数,可用。另一方面,如果“hasRight”为false,则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”对我的条目进行排序,因此在“hasRight”设置为false的条目之前显示该标志设置为true的条目。然后,根据属性“sortOrder”对条目进行排序。这适用于“hasRight”设置为true的所有条目,因为每个条目都有一个唯一的“sortOrder”。

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

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

1 个答案:

答案 0 :(得分:2)

你想要的是不可能的。但即使有可能它也无法解决您的问题。因为没有第二个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