排序到多个关系在核心数据中设置

use*_*439 27 iphone core-data

我有两个模型部门和工人.部门与工人有很多关系(工人).Worker具有firstName字段.如何通过访问departmet.workers获得按firstName排序的工作人员列表?有没有办法在多对多关系中添加排序描述符?

Adr*_*nig 31

与Adrian Hosey的代码相比略有改进:

您也可以执行以下操作,而不是手动迭代所有工作人员:

-(NSArray *)sortedWorkers {
  NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
  NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease];

  return [self.workers sortedArrayUsingDescriptors:sortDescriptors];
}
Run Code Online (Sandbox Code Playgroud)

可能与内部的迭代完全相同,但也许他们以某种方式使它更有效.打字肯定少了......

注意:以上仅适用于iOS 4.0+和OSX 10.6+.在旧版本中,您需要将最后一行替换为:

  return [[self.workers allObjects] sortedArrayUsingDescriptors:sortDescriptors];
Run Code Online (Sandbox Code Playgroud)

  • 从OS X 10.6开始,既不需要手动迭代,也不需要`[allObjects]`,因为NSSet本身实现了`sortedArrayUsingDescriptors:`,从而避免了多余的临时NSArray的创建. (4认同)
  • 嗯,排序是O(n*log(n)),迭代是O(n).虽然代码较少,但肯定较慢. (3认同)

Bar*_*ark 7

Core Data中的To-many关系被建模为无序集.但是,您可以在包含排序描述符的Department实体上创建fetched属性,也可以在应用程序中对内存进行排序(NSArrayController将通过设置其sortDescriptors属性为您执行此操作).

  • 我投票支持获取的房产,因为它似乎是Core Data中"最自然的方式". (2认同)

Han*_*One 7

对AdrianSchönig解决方案的微小改进:

到目前为止,有必要转换self.workers为NSSet*

-(NSArray *)sortedWorkers {
   NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
   NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease];

   return [(NSSet*)self.workers sortedArrayUsingDescriptors:sortDescriptors];
 }
Run Code Online (Sandbox Code Playgroud)