使用to来排序NSFetchedResultsController
情景
我有两个实体: Item和ListDetail (包含每个项目的不同列表的价格)。 这是绝对必要的,我无法为物品实体提供价格属性,因为每个商品可以为不同的动态列表(零售,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