0

情景排序NSFetchedResultsController采用一对多的关系属性

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

的关系是:

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

当前活动列表中我的应用程序的变化dinamically,让我们说,我对目前的活动列表整型变量:_ACTIVE_LIST_CODE_。当我需要一个价格的项目对象我的项目类使用的helper方法:

-(NSNumber*) getPrice { 
    NSSet *lists=[self.lists filteredSetUsingPredicate: [NSPredicate predicateWithFormat:@"listId == %d",_ACTIVE_LIST_CODE_]]; 
    ListDetail *activeList=[[lists allObjects] objectAtIndex:0]; 
    return activeList.price; 
} 

的问题

我使用一个UITableView与NSFetchedResultController以选择和显示一些项目的不同部分。没什么特别的。我想使用活动列表的物品价格来订购fetchedObjects。如果价格是项的属性我只会平添几分描述符提取请求,像这样:

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

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

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

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

我尝试了一些解决办法,都没有成功:

1)观察_ACTIVE_LIST_CODE_更改设定的项目价格在非瞬态属性。 2)在获取请求之后,在呈现表视图之前,使用瞬态“价格”属性重新排序具有获取对象的全新数组,按照升序整数索引“i”迭代排序阵列,并将该值赋值给Item实体的非瞬态属性“订单”。在获取请求中对排序描述符使用“order”。 (这种方法在这里描述:Re-ordering NSFetchedResultsController

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

+0

1)如何减慢速度?主动列表代码应该不会频繁或批量更改,对吧? – Mundi

+0

当用户选择不同的客户端时,列表代码可能会更改。这种情况发生的并不是那么频繁,但即使有一次,通过50k项目进行for循环,更改价格属性并保存上下文将应用冻结8-9秒。这是不可接受的! – Donnit

+0

您可以在后台线程上执行更新并通过NSFetchedResultsControllerDelegate更新UI。 – Mundi

回答

0

取而代之取ListDetail怎么样?您可以严格按照您的建议限制和排序适当的谓词和排序描述符。现在

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

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

,以组由项目的一些属性应该是简单而有效的,因为它是一个一对一的关系。您取得的结果控制器的sectionNameKeyPath可能类似于

@"item.category" 
相关问题