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)
它们都有效,但它们会降低性能,因为我在获取结果中有数千个项目......有什么想法吗?
答案 0 :(得分:0)
取而代之的是ListDetail
呢?您可以使用适当的谓词和排序描述符进行限制和排序,与您的建议完全相同。
fetchRequest.predicate =
[NSPredicate predicateWithFormat:@"listID = %@", activeListCode];
fetchRequest.sortDescriptors =
@[[NSSortDescriptor sortDescriptorWithKey:@"price" ascending:YES]];
现在,按项目的某些属性进行分组应该简单有效,因为它是一对一的关系。您获取的结果控制器的sectionNameKeyPath
可能类似于
@"item.category"