NSFetchedResultsController部分按类别排序

我需要使用我的对象排序

[[NSFetchedResultsController alloc] initWithFetchRequest:request 
                                    managedObjectContext:context 
                                      sectionNameKeyPath:sectionName 
                                               cacheName:nil];

我想按照他们的class来排序。 例如,类型为MyObjectType对象放入一个部分,而类型为OtherObjectType对象放入第二部分,其中两个对象类型将出现在结果中,因为OtherObjectType继承自MyObjectType 。 在上述方法中传递@"class"作为sectionNameKeyPath参数似乎可行。 但是,为了获得正确的排序,我还需要NSFetchRequest的排序描述符来根据类进行排序:

NSSortDescriptor *sectionDescriptor = [NSSortDescriptor
                                       sortDescriptorWithKey:@"class"
                                       ascending:YES];

使用这种类型描述符给我错误Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath class not found in entity

为了清楚起见,下面是我想要的全部代码:

  NSFetchRequest* myRequest = [[NSFetchRequest alloc] 
                                 initWithEntityName:@"myEntityName"];

  NSSortDescriptor *nameDescriptor = [NSSortDescriptor 
                                      sortDescriptorWithKey:@"myName"
                                      ascending:YES];

  NSSortDescriptor *sectionDescriptor = [NSSortDescriptor
                                           sortDescriptorWithKey:@"class"
                                           ascending:YES];
  request.sortDescriptors = @[sectionDescriptor, nameDescriptor];

  [[NSFetchedResultsController alloc]
     initWithFetchRequest:myRequest
     managedObjectContext:myContext
     sectionNameKeyPath:@"class"
     cacheName:nil];

请记住,如果您使用一个实体及其子实体,则只能执行此操作,因为NSFetchRequest需要实体进行搜索(您可以指定也搜索子实体)。

您需要声明一个属性,以标识要检索和重新组合的正确类型的记录。 因为class是一个运行时值,所以您需要能够使用标识符在底层存储中使用。 因此,在您的具体情况下,我会在所有子实体的父实体上使用常量(字符串或数字)属性来标识此记录属于哪个子组。


你不能用单个FRC来做到这一点,因为NSFetchRequest只能绑定到一个NSManagedObject子类。 相反,您可以使用多个提取的结果控制器,并在查找对象时手动设置节索引。

链接地址: http://www.djcxy.com/p/6145.html

上一篇: NSFetchedResultsController section sorting by class

下一篇: iOS CoreData NSFetchedResultsController sections and sorting