使用NSFetchedResultsController和SortDescriptors

时间:2017-03-15 09:23:55

标签: ios swift nsfetchedresultscontroller nsfetchrequest nssortdescriptor

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

我有一个UITableView,其中的部分使用NSFetchedResultsController发出请求并从我的数据库中获取对象,并将它们分成基于sectionNameKeyPath的部分,如下所示:

var aFetchedResultsController = NSFetchedResultsController(fetchRequest: req, managedObjectContext: managedObjectContext!, sectionNameKeyPath: "dateStatus", cacheName: nil)

这非常合适,它会检索我的数据并填充两个不同的部分,如下所示:"Actually" : [1,2,3,4,5] "Soon" : [1,2]

我的dateStatus属性只是一个基于double的String类型,如下所示:

var dateStatus : String { get { return licenseStart.doubleValue / 1000 < NSDate().timeIntervalSince1970 ? DateStatus.Actually.rawValue : DateStatus.ComingSoon.rawValue } }

直到这一部分一切正常。但现在我想添加一个排序选项,让用户根据licenseStart对结果进行排序,但保持各个部分的顺序相同。所以我想让我的&#34;实际上&#34;第一节和我的#34;很快&#34;部分但在两个部分内部我想根据用户的选择对项目ASC或DESC进行排序。

所以,现在,如果用户点击&#34;命令后代&#34;如果使用:

创建一个新的NSSortDescriptors数组,我会怎么做

[NSSortDescriptor(key: "licenseStart", ascending: false), NSSortDescriptor(key: "plan.planId", ascending: false)]

和一个带有这个新排序描述符的新afetchedResultsController!.performFetch(),但是这个新的提取之后的内容是

"Soon" : [2,1] "Actually" : [5,4,3,2,1]

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

"Actually" : [5,4,3,2,1] "Soon" : [2,1]

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

如果有任何不清楚的地方,请随时询问。

非常感谢你

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

我已经在另一个Stackoverflow问题中读到了这个但这不适用于我的情况..我想知道为什么..(在我的情况下,NSSortDescriptors也使用第一个排序描述符来排序其中的元素部分)

A fetched results controller (FRC) uses only the first sort descriptor to group (and sort) the objects into sections. A second sort descriptor can be added to sort the objects within each section.

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

我认为一个可能很好的解决方案是创建一个NSExpressionDescription来计算performFetch中的dateStatus。我的意思是..我可以基于这个表达式创建一个可以有两个整数值0或1的新列:licenseStart.doubleValue / 1000 < NSDate().timeIntervalSince1970 ? 0 : 1用于节名称

然后我可以先使用这个新列然后使用其他过滤器进行排序,所以在这两个过程中我都会使用此命令对sectionNameKeyPath进行相等的升序,然后再使用其他过滤器。

但我不知道如何使用NSExpressionDescription确切地知道这一点。

0 个答案:

没有答案