使用to来排序NSFetchedResultsController

情景

我有两个实体: ItemListDetail (包含每个项目的不同列表的价格)。 这是绝对必要的,我无法为物品实体提供价格属性,因为每个商品可以为不同的动态列表(零售,B2C等)提供更多的价格。

关系是:

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

我应用程序中的当前活动列表发生了变化,所以我们假设我有一个带有当前活动列表的整型变量:_ACTIVE_LIST_CODE_。 当我需要物品对象的价格时,我在Item类上使用一个辅助方法:

-(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。 如果价格是Item的一个属性,我会简单地向获取请求添加一个排序描述符,如下所示:

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

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

如果对排序描述符使用瞬态属性,我会设置一个使用我的帮助器方法即时计算的价格瞬态属性。 没事做。

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

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

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

2)在获取请求之后,在呈现表视图之前,使用瞬态“价格”属性重新排序具有提取对象的全新数组,按照升序整数索引“i”迭代排序阵列,并将该值分配给非瞬态物品“订单”为物品实体。 在获取请求中对排序描述符使用“order”。 (这里描述了这种方法:重新排序NSFetchedResultsController)

他们两个都有效,但是他们放慢了性能,因为我在抓取结果中有数千个项目...任何想法?


取而代之的是如何获取ListDetail ? 您可以严格按照您的建议限制和排序适当的谓词和排序描述符。

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

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

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

@"item.category"
链接地址: http://www.djcxy.com/p/6139.html

上一篇: Sorting NSFetchedResultsController using a to

下一篇: UISearchDisplayController/NSFetchedResultsController with custom sort order