情景排序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)
他们两个都可以工作,但是他们放慢了性能,因为我在抓取结果中有数以千计的项目...任何想法?
1)如何减慢速度?主动列表代码应该不会频繁或批量更改,对吧? – Mundi
当用户选择不同的客户端时,列表代码可能会更改。这种情况发生的并不是那么频繁,但即使有一次,通过50k项目进行for循环,更改价格属性并保存上下文将应用冻结8-9秒。这是不可接受的! – Donnit
您可以在后台线程上执行更新并通过NSFetchedResultsControllerDelegate更新UI。 – Mundi