使用to-many关系属性对NSFetchedResultsController进行排序

时间:2013-07-22 18:19:28

标签: core-data one-to-many nsfetchedresultscontroller nsfetchrequest nssortdescriptor

SCENARIO

我有两个实体: ListDetail (其中包含每个项目的不同列表的价格)。这是绝对必要的,我无法为Item实体提供价格属性,因为每个项目可以为不同的动态列表(零售,b2b ecc。)提供更多价格。

关系是:

Item (lists) <------->> (item) ListDetail

我的应用中的当前活动列表会改变,所以假设我有一个带有当前活动列表的整数变量:_ACTIVE_LIST_CODE_。当我需要一个item对象的价格时,我在Item类上使用了一个helper方法:

-(NSNumber*) getPrice {
    NSSet *lists=[self.lists filteredSetUsingPredicate: [NSPredicate predicateWithFormat:@"listId == %d",_ACTIVE_LIST_CODE_]]; 
    ListDetail *activeList=[[lists allObjects] objectAtIndex:0];
    return activeList.price;
}

问题

我使用带有NSFetchedResultController的UITableView来选择和显示不同部分的一些项目。没什么特别的。我想使用活动列表的项目价格来订购fetchedObjects。如果price是Item的一个属性,我会在fetch请求中添加一个排序描述符,如下所示:

[NSSortDescriptor sortDescriptorWithKey:@"price" ascending:YES];

但如前所说,这是不可能的,价格是动态属性。

如果对排序描述符使用瞬态属性,我会设置使用我的帮助方法在飞行中计算的价格瞬态属性。无所事事。

在“lists.price”中使用描述符中的键路径是不可能的(或者我可能不知道该怎么做),只是因为它是一个多对多的关系并且它是用NSSet建模的。

我尝试了一些解决方法,但没有成功:

1)观察_ACTIVE_LIST_CODE_更改以在非瞬态属性中设置项目价格。

2)在获取请求之后,在呈现表视图之前,使用瞬态“price”属性对带有提取对象的全新数组进行重新排序,按照升序整数索引“i”迭代排序数组并将此值赋值给a Item实体的非瞬态属性“order”。在获取请求中对排序描述符使用“order”。 (此处描述了这种方法:Re-ordering NSFetchedResultsController

它们都有效,但它们会降低性能,因为我在获取结果中有数千个项目......有什么想法吗?

1 个答案:

答案 0 :(得分:0)

取而代之的是ListDetail呢?您可以使用适当的谓词和排序描述符进行限制和排序,与您的建议完全相同。

fetchRequest.predicate = 
  [NSPredicate predicateWithFormat:@"listID = %@", activeListCode];

fetchRequest.sortDescriptors = 
  @[[NSSortDescriptor sortDescriptorWithKey:@"price" ascending:YES]];

现在,按项目的某些属性进行分组应该简单有效,因为它是一对一的关系。您获取的结果控制器的sectionNameKeyPath可能类似于

@"item.category"