使用两个属性对提取的结果控制器数据进行排序,使用排序描述符



我有一个简单的植物提醒应用程序。我正在尝试对通过Core Data的NSFetchedResultsController获得的数据进行排序。我的问题是:我尝试排序的数据依赖于对 2 个属性的操作。

我有一个具有以下属性的Plant对象:waterCyclelastWater

waterCycle是植物之间需要水的天数(Double),lastWater是植物最后一次浇水的日期(NSDate)。我有一个函数,可以计算植物是否到期,因为它需要水后迟到了多少天。(即3天前需要的水!

经过一些研究,我相信我不能根据计算的属性进行排序,也不能对获取请求做任何太时髦的事情。我试图通过NSFetchRequestNSSortDescriptor实现这一目标,但似乎没有任何效果。欢迎就如何应对这一挑战提出任何建议。

我想到的一种选择是我可以将这些数据保存在对象记录中,但这意味着应用程序需要每天重新计算和保存所有对象,以便只增加我认为非常麻烦的晚日数字。

这里有一些代码,不要犹豫,询问更多信息或代码。谢谢!


NSFetchedResultsController

private var fetchedResultsController: NSFetchedResultsController {
if _fetchedResultsController != nil {
return _fetchedResultsController!
}
let fetchRequest = NSFetchRequest()
fetchRequest.entity = NSEntityDescription.entityForName("Plant", inManagedObjectContext: managedObjectContext!)
// this should sort the list so plant that needs water are on top
let waterCycleSortDescriptor = NSSortDescriptor(key: "waterCycle", ascending: true)
let lastWaterSortDescriptor = NSSortDescriptor(key: "lastWater", ascending: true)
fetchRequest.sortDescriptors = [waterCycleSortDescriptor, lastWaterSortDescriptor]
let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest,
managedObjectContext: managedObjectContext!,
sectionNameKeyPath: nil, cacheName: PlantRepository.getCacheName())
aFetchedResultsController.delegate = self
_fetchedResultsController = aFetchedResultsController
do {
try _fetchedResultsController!.performFetch()
} catch {
fatalError("(error)")
}
return _fetchedResultsController!
}

我使用类似于下面的函数计算迟到天数(简化为帖子):

static func getLateDays(lastWater: NSDate, waterCycle: Double) -> Int {
// add waterCycle days to lastWater
let toDate = lastWater.dateByAddingTimeInterval(NSTimeInterval(60*60*24*waterCycle))
// calc late days after due date
let lateDays = NSCalendar.currentCalendar().components(NSCalendarUnit.Day, fromDate: toDate, toDate: NSDate(), options: NSCalendarOptions(rawValue: 0))
return lateDays.day
}

我一直在寻找从计算属性/瞬态属性中对NSFetchedResultsController进行排序的方法,并且在尝试了几次黑客之后发现没有好的选择。

如果我正在解决这个特定问题,我会添加一个属性来保存要浇水的植物的目标日期,并使用它进行排序。

您不需要每天计算此值,而是仅在用户更新lastWater值时才更新此值 - 这对于确保结果按顺序排序是准确的,并且在视图中,您可以即时计算您提前(或落后)多少天浇水计划。

最新更新