我有一个实体Address
和date
属性。
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?
}
答案 0 :(得分:1)
您可以使用sectionNameKeyPath
。获取和排序必须基于存储在数据库中的值,但sectionNameKeyPath
可以基于对象的任何属性 - 甚至是您自己创建的属性。因此,您可以在Address
对象上添加类似 - (NSString *)headerName的属性。
以下是需要注意的事项:
在fetchedResultsController中为每个对象调用sectionNameKeyPath
。所以被调用的方法应该很快。在您的情况下,使用日历计算当天的开始时间是资源密集型的。因此,我建议创建一个缓存NSDate firstMomentOfCurrentDate
的全局位置,因此可以使用日期比较和简单数学计算这些部分。
您应该监控重要的时间变化(UIApplicationSignificantTimeChangeNotification
),这样您就可以在日期更改时更新表格,并且需要重新加载部分。