0

设想

我有两个实体:ItemListDetail(其中包含每个项目的不同列表的价格)。这是绝对需要的,我无法为 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

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

4

1 回答 1

0

ListDetail取而代之怎么样?您可以完全按照您的建议使用适当的谓词和排序描述符进行限制和排序。

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

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

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

@"item.category"
于 2013-07-23T20:12:07.887 回答