Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Core data 使用对多关系属性对NSFetchedResultsController进行排序_Core Data_One To Many_Nsfetchedresultscontroller_Nsfetchrequest_Nssortdescriptor - Fatal编程技术网

Core data 使用对多关系属性对NSFetchedResultsController进行排序

Core data 使用对多关系属性对NSFetchedResultsController进行排序,core-data,one-to-many,nsfetchedresultscontroller,nsfetchrequest,nssortdescriptor,Core Data,One To Many,Nsfetchedresultscontroller,Nsfetchrequest,Nssortdescriptor,场景 我有两个实体:项目和列表详细信息(其中包含每个项目不同列表的价格)。这是绝对需要的,我不能为项目实体提供价格属性,因为每个项目都可以为不同的动态列表(零售、b2b ecc.)提供更多的价格 这种关系是: 项目(列表)>(项目)列表详细信息 我的应用程序中的当前活动列表会发生动态变化,因此假设我有一个整数变量与当前活动列表一起使用:_active_list_CODE_。当我需要一个item对象的价格时,我会在item类上使用一个helper方法: -(NSNumber*)获取价格{ NSS

场景

我有两个实体:项目列表详细信息(其中包含每个项目不同列表的价格)。这是绝对需要的,我不能为项目实体提供价格属性,因为每个项目都可以为不同的动态列表(零售、b2b ecc.)提供更多的价格

这种关系是:

项目(列表)>(项目)列表详细信息
我的应用程序中的当前活动列表会发生动态变化,因此假设我有一个整数变量与当前活动列表一起使用:_active_list_CODE_。当我需要一个item对象的价格时,我会在item类上使用一个helper方法:

-(NSNumber*)获取价格{
NSSet*lists=[self.lists filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@“listId=%d”,“活动列表代码”];
ListDetail*activeList=[[lists allObjects]objectAtIndex:0];
返回activeList.price;
}
问题

我将UITableView与NSFetchedResultController一起使用,以便为不同的部分选择和显示一些项目。没什么特别的。我想使用活动列表的items price来订购FetchedObject。如果price是Item的一个属性,我只需向fetch请求添加一个排序描述符,如下所示:

[NSSortDescriptor sortdescriptor with key:@“价格”升序:是];
但正如前面所说,这是不可能的,价格是一个动态属性

如果可以对排序描述符使用瞬态属性,我将使用助手方法设置动态计算的瞬态属性的价格。无事可做

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

我尝试了一些变通办法,但没有成功:

1) 观察(活动)(列表)(代码)更改以设置非暂时属性中的项目价格

2) 在fetch请求之后,在显示表视图之前,使用瞬态“price”属性对具有已获取对象的全新数组重新排序,在升序整数索引“i”之后迭代Ordered数组,并将该值分配给Item实体的非瞬态属性“order”。在获取请求中使用排序描述符的“顺序”。(此处介绍了这种方法:)


它们都可以工作,但它们会降低性能,因为我在获取结果中有数千项。。。有什么想法吗?

取而代之的是获取
listdail
?您可以使用适当的谓词和排序描述符进行限制和排序,就像您建议的那个样

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

fetchRequest.sortDescriptors = 
  @[[NSSortDescriptor sortDescriptorWithKey:@"price" ascending:YES]];
现在,根据项的某个属性进行分组应该是简单而有效的,因为它是一对一的关系。获取的结果控制器的
sectionNameKeyPath
可以是

@"item.category"

1)如何让事情变慢?活动列表代码应该不会频繁或批量更改,对吗?当用户选择不同的客户端时,列表代码可能会更改。这种情况并不经常发生,但即使发生一次,通过50k个项目进行for循环,更改price属性并保存上下文也会将应用程序冻结8-9秒。这是不能接受的!您可以在后台线程上进行更新,并通过NSFetchedResultsControllerDelegate更新UI。当然可以,但这不是一个很大的优势:项目需要在客户端选择后立即显示(即活动列表更改),因此我需要更新price属性并按价格对项目进行排序。这不符合逻辑。存在设备更改-->大更新-->后台线程。或者有一个活动列表更改-->小更新-->立即从bg线程返回。