设想
我有两个实体:Item和ListDetail(其中包含每个项目的不同列表的价格)。这是绝对需要的,我无法为 Item 实体提供价格属性,因为每个项目都可以为不同的动态列表(零售、b2b ecc)提供更多价格。
关系是:
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。如果 price 是 Item 的一个属性,我将简单地在 fetch 请求中添加一个排序描述符,如下所示:
[NSSortDescriptor sortDescriptorWithKey:@"price" ascending:YES];
但正如之前所说,这是不可能的,价格是一个动态属性。
如果对排序描述符使用瞬态属性是可能的,我将使用我的辅助方法设置一个动态计算的价格瞬态属性。没事做。
在描述符中使用像“lists.price”这样的键路径是不可能的(或者我可能不知道该怎么做),只是因为它是一对多的关系并且它是用 NSSet 建模的。
我尝试了一些解决方法,但没有成功:
1) 观察 _ACTIVE_LIST_CODE_ 更改以在非瞬态属性中设置项目价格。
2)在获取请求之后,在呈现表视图之前,使用瞬态“价格”属性重新排序具有提取对象的全新数组,在升序整数索引“i”之后迭代有序数组并将此值分配给非瞬态项目实体的属性“订单”。在获取请求中使用“order”作为排序描述符。(这里描述了这种方法:重新排序 NSFetchedResultsController)
它们都有效,但它们会降低性能,因为我在获取结果中有数千个项目......知道吗?