swift - 排序获取的结果 Controller 数据,使用两个属性,使用排序描述符

标签 swift core-data nsfetchrequest

我有一个简单的植物提醒应用程序。我正在尝试对通过 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
}

最佳答案

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

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

您不需要每天都计算它,而是仅在用户更新 lastWater 的值时更新它 - 这对于确保结果是有序的是准确的,并且在查看您可以即时计算浇水计划提前(或推迟)多少天。

关于swift - 排序获取的结果 Controller 数据,使用两个属性,使用排序描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42657625/

相关文章:

iOS App - 为每个新的一天更新字符串数组

ios - ScrollView 和分段 Controller

iphone - NSManagedObject initWithEntity : insertIntoManagedObjectContext: EXC_BAD_ACCESS

ios - 嵌套核心数据获取

ios - 使用 coredata 获取父文件夹内的子文件和文件夹的谓词

ios - CKModifyRecordsOperation 不删除记录

ios - 尝试在表格 View 中按日期对核心数据对象进行排序

ios - tableView + CoreData 上的空单元格

objective-c - Objective C,核心数据获取请求

objective-c - 如何从我的 appDelegate 访问我的 viewController? ( swift )