Ios 使用NSFetchedResultsController和SortDescriptor对节内的项进行排序

Ios 使用NSFetchedResultsController和SortDescriptor对节内的项进行排序,ios,swift,nsfetchedresultscontroller,nsfetchrequest,nssortdescriptor,Ios,Swift,Nsfetchedresultscontroller,Nsfetchrequest,Nssortdescriptor,排序行时,我的自定义UITableView遇到问题。让我向你解释一下 我有一个UITableView,其中包含使用NSFetchedResultsController发出请求并从数据库中获取我的对象的节,并根据节名KeyPath将它们划分为节,如下所示: var aFetchedResultsController = NSFetchedResultsController(fetchRequest: req, managedObjectContext: managedObjectContext!,

排序行时,我的自定义UITableView遇到问题。让我向你解释一下

我有一个UITableView,其中包含使用NSFetchedResultsController发出请求并从数据库中获取我的对象的节,并根据节名KeyPath将它们划分为节,如下所示:

var aFetchedResultsController = NSFetchedResultsController(fetchRequest: req, managedObjectContext: managedObjectContext!, sectionNameKeyPath: "dateStatus", cacheName: nil)
这非常好,它检索我的数据并填充两个不同的部分,就像这样:
“实际上”:[1,2,3,4,5]
“很快”:[1,2]

我的
dateStatus
属性只是一个基于双精度的字符串类型,如下所示:

var-dateStatus:字符串{
得到{
return licenseStart.doubleValue/1000

在这部分之前,一切正常。但是现在我想添加一个排序选项,允许用户根据
licenseStart
对结果进行排序,但保持各部分的顺序相同。所以我想先有我的“实际”部分和“很快”部分,但在这两个部分中,我想根据用户的选择对项目ASC或DESC进行排序

因此,现在如果用户单击“order Substant”,如果使用以下命令创建一个新的
NSSortDescriptors
数组,我会做什么:

[NSSortDescriptor(键:“licenseStart”,升序:false),NSSortDescriptor(键:“plan.planId”,升序:false)]

还有一个新的
afetchedResultsController!。performFetch()
使用这个新的排序描述符,但是在这个新的获取之后我得到的是

“很快”:[2,1]
“实际”:[5,4,3,2,1]

这并不是我想要的,各部分中的项目以正确的方式排序,但我希望各部分保持与以前相同的顺序,即:

“实际”:[5,4,3,2,1]
“很快”:[2,1]

我尝试过不同的方法来实现这种行为,但没有运气,我也尝试过在stackoverflow和google上发现类似的问题,所以我想知道是否有人遇到过同样的问题

如果有什么不清楚的地方,请随时询问

非常感谢你

******编辑*******

我在另一个Stackoverflow问题中读到了这一点,但这不适用于我的情况。。我想知道为什么。。(在我的例子中,NSSortDescriptor还使用第一个排序描述符对节中的元素进行排序)

fetched results controller(FRC)仅使用第一个排序描述符将对象分组(和排序)到节中。可以添加第二个排序描述符来对每个部分中的对象进行排序。

******编辑2*******

我意识到一个很好的解决方案是创建一个NSExpressionDescription来计算performFetch中的
dateStatus
。我是说。。我可以基于以下表达式创建一个新列,该列可以有两个整数值0或1:
licenseStart.doubleValue/1000
用于节名

然后,我可以先使用这个新列进行排序,然后使用其他过滤器,所以在这两种情况下,我都将使用此函数对sectionNameKeyPath进行排序,并使用相等升序,然后使用其他过滤器


但是我不知道如何使用NSExpressionDescription来实现这一点。

与sectionNameKeyPath相对应的排序描述符必须是fetch请求中的第一个排序描述符。@MartinR,是的,NSSortDescriptor中的第一项与sectionNameKeyPath中使用的元素相同(在数据库中,licenseStartForSort和licenseStart是相同的)我编辑了这些问题以避免这种混淆。如果您想在
不久之前
实际上
,您应该使用
NSSortDescriptor(键:“licenseStart”,升序:true)
,而不是
NSSortDescriptor(键:“licenseStart”,升序:false)
。尝试从方法更新表视图,而不是直接从NSFetchedResultsController委托更新。您可以调用[[self-fetchedResultsController]节]对于节。但是使用一些自定义方法更新它。在获取数据的每个地方都执行相同的操作。首先排序,然后调用objectAtIndex。您好@OwenZhao谢谢您的回答,如果我按照您的建议执行,结果将与升序相同。因为我对键路径使用相同的属性,如下所示:
case.START\u ASC:return[NSSortDescriptor(key:“licenseStartt”,升序:true),NSSortDescriptor(key:“plan.planId”,升序:true)]大小写开始\结束:返回[NSSortDescriptor(key:“licenseStart”,升序:true),NSSortDescriptor(key:“plan.planId”,升序:false)]
开始\结束和开始\结束之间没有区别