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