我正在使用NSFetchedResultsController在tableView中显示消息。
消息按日期分为几部分。当前日期是一个计算的瞬态属性。
extension Message {
@objc public var messageDateSectionIdentifier: String? {
var dateString = ""
self.willAccessValue(forKey: "messageDateSectionIdentifier")
if let date = self.messageDateCreated {
let calendar = Formatters.calendar
let today = Date()
let yesterday = today.addingTimeInterval(-86400.0)
if calendar.isDate(date, inSameDayAs: today) {
dateString = LocalizedStrings.DateStrings.Today
} else if calendar.isDate(date, inSameDayAs: yesterday) {
dateString = LocalizedStrings.DateStrings.Yesterday
} else {
dateString = Formatters.messageDateFormatter.string(from: date)
}
}
self.didAccessValue(forKey: "messageDateSectionIdentifier")
return dateString
}
}
以及NSFetchedResultsController的初始化:
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: "messageDateSectionIdentifier", cacheName: "root")
使用暂态计算属性作为sectionNameKeyPath的fetchedResultsController一切正常,但是这意味着fetchBatchSize是无用的,因为fetchedResultsController会在batchSize循环中加载所有数据。使用仪器CoreData确认了这一点。如果我为sectionNameKeyPath设置nil或将其设置为非瞬态,则fetchBatchSize起作用,并且仅加载第一批。但是,由于具有过渡属性,所有批次都将首先加载。
唯一的解决方案是不对sectionNameKeyPath使用过渡属性。还有其他方法可以使用消息上的时间戳按日期排列sectionNameKeyPath而不使用过渡属性吗?
我不想存储消息的其他日期属性,因为用户可以更改时区。