如何在不使用过渡属性的情况下为NSFetchedResultsController设置sectionNameKeyPath而不使用过渡属性

时间:2018-07-08 21:41:14

标签: ios swift xcode core-data nsfetchedresultscontroller

我正在使用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而不使用过渡属性吗?

我不想存储消息的其他日期属性,因为用户可以更改时区。

0 个答案:

没有答案