如何重新计算NSFetchedResultsController的IndexPath,记录分为3个部分:今天,未来,过去?

时间:2017-04-24 06:44:07

标签: ios swift nsfetchedresultscontroller

我有一个实体Addressdate属性。

fetchedResultsController的简单初始化是:

private func setupFetchedResultsController() {

    let context = NSManagedObjectContext.mr_default()
    let fetchRequest = NSFetchRequest<Address>(entityName: "Address")
    let dateDescriptor = NSSortDescriptor(key: "date", ascending: true)

    fetchRequest.predicate = NSPredicate(value: true)
    fetchRequest.sortDescriptors = [dateDescriptor]

    fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
    fetchedResultsController.delegate = self

    try! fetchedResultsController.performFetch()
    tableView.reloadData()
}

但问题是如下,因为我需要显示如下结果:

假设今天是24.04.2017

TODAY SECTION

A 24.04.2017 
B 24.04.2017

FUTURE SECTION

D 27.04.2017
E 28.04.2017
G 28.04.2017
F 29.04.2017

PAST SECTION

C 17.02.2017
E 19.04.2017
F 20.04.2017

我该怎么做以及如何显示这样的结果?

可能的解决方案是:

func recalculatedIndexPath(for indexPath: IndexPath) -> IndexPath {
    //here need to convert indexPath from fetchedresultsController to the one my table view expects
    //the question is how?
}

1 个答案:

答案 0 :(得分:1)

您可以使用sectionNameKeyPath。获取和排序必须基于存储在数据库中的值,但sectionNameKeyPath可以基于对象的任何属性 - 甚至是您自己创建的属性。因此,您可以在Address对象上添加类似 - (NSString *)headerName的属性。

以下是需要注意的事项:

  • 在fetchedResultsController中为每个对象调用sectionNameKeyPath。所以被调用的方法应该很快。在您的情况下,使用日历计算当天的开始时间是资源密集型的。因此,我建议创建一个缓存NSDate firstMomentOfCurrentDate的全局位置,因此可以使用日期比较和简单数学计算这些部分。

  • 您应该监控重要的时间变化(UIApplicationSignificantTimeChangeNotification),这样您就可以在日期更改时更新表格,并且需要重新加载部分。