Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSFetchedResultsController节按类排序_Ios_Objective C_Core Data_Nsfetchedresultscontroller_Nsfetchrequest - Fatal编程技术网

Ios NSFetchedResultsController节按类排序

Ios NSFetchedResultsController节按类排序,ios,objective-c,core-data,nsfetchedresultscontroller,nsfetchrequest,Ios,Objective C,Core Data,Nsfetchedresultscontroller,Nsfetchrequest,我需要使用 [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:sectionName

我需要使用

[[NSFetchedResultsController alloc] initWithFetchRequest:request 
                                    managedObjectContext:context 
                                      sectionNameKeyPath:sectionName 
                                               cacheName:nil];
我想按它们的
类对它们进行排序。例如,类型为
MyObjectType
的对象进入一个部分,类型为
OtherObjectType
的对象进入第二个部分,这两种对象类型都将出现在结果中,因为
OtherObjectType
继承自
MyObjectType
。在上述方法中,将
@“class”
作为
sectionNameKeyPath
参数传递似乎有效。但是,为了获得正确的排序,我还需要
NSFetchRequest
的排序描述符根据类进行排序:

NSSortDescriptor *sectionDescriptor = [NSSortDescriptor
                                       sortDescriptorWithKey:@"class"
                                       ascending:YES];
使用此排序描述符会导致错误
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因是:“在实体中找不到keypath类

为清楚起见,以下是我希望使用的完整代码块:

  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];

您不能使用单个FRC执行此操作,因为NSFetchRequest只能绑定到单个NSManagedObject子类。相反,您可以使用多个“获取结果”控制器,并在查找对象时手动设置节索引。

请记住,只有在使用一个实体及其子实体时才能执行此操作,因为NSFetchRequest需要搜索一个实体(您可以指定也搜索子实体)


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

不一定。它们被绑定到一个实体上,这个实体可以包含子实体。我想这是一个公平的点,你可以遍历对象图,但这最多是间接的。然而,ThoughtVances试图在sectionNameKeyPath中实现的目标是不可能的……相信我,我自己肯定已经尝试了足够多次了。假设他没有子关系结构,就像你建议的那样,他要么需要使用单独的FRC,要么需要自己处理fetch请求。我想说的是,你可以只使用一个FRC,只要它们来自同一个子实体树。您不能使用在继承中彼此不关联的不同实体。是的,您需要在适当的情况下手动偏移indexPath.section(例如NSFetchedResultsController委托方法),但这是完全可行的,并不像您想象的那么困难。我以前做过很多次,效果很好。只需确保清理样板文件NSFetchedResultsController委托方法,以反映两个方法的节索引均为0的事实(遗憾的是,您无法为第二个控制器创建空节0)我同意@J2theC的观点,如果你能避免使用继承的第二个FRC,那就更好了。对。我忘了提到我正在处理的类都是我正在使用结果控制器获取的类的子实体。所以,他们都在那里。我只需要把它们分类。目前,我正在父实体上使用string属性来标识该节。我希望我能摆脱这个属性。这个属性对你有帮助,因为它允许你在持久存储级别进行操作,而不一定是在内存中(除非你使用的是内存中的存储)。如果使用SQLite,这可能比在内存中查找每个实体/子实体的类成员的运行时值快得多。简言之,您已经做得很好了。我甚至没有想到执行运行时变量检查的成本。总之,我认为这是最好的方法。我将保留当前用于将它们划分为多个部分的属性。