我有一个NSFetchedResultsController来显示tableView中的消息 .

我想使用fetchLimit属性按批次加载消息 . (fetchBatchSize对我不起作用,因为我正在使用sectionNameKeyPath的瞬态属性)

最初我得到偏移80的消息 . 从那里我使用该消息的日期来设置fetchedResultsController fetch的谓词 .

当用户滚动到聊天表的顶部时,我想加载另一批80条消息 . 目前,我使用获取请求来获取与先前加载的上一条消息相差80的消息 . 然后我可以获取该消息的日期并使用该日期重新初始化fetchedResultsController . 然后加载160条消息 . 等等 .

我理想的做法是不再获取最初的80条消息 . 要加载另外80条消息并将它们与已加载的80条消息合并 . 不知道如何实现这一目标 .

一旦使用第一次获取初始化fetchedResultsController,是否有可能从后续获取请求中添加更多数据而不重新加载原始数据?

这是我用来初始化fetchedResultsController的方法:

var firstMessageDate: Date?

func initializeResultsController() {
    let firstRequest:NSFetchRequest<Message> = Message.fetchRequest()

    if firstMessageDate != nil {
        let dateSort = NSSortDescriptor(key: "messageDateCreated", ascending: false)
        firstRequest.sortDescriptors = [dateSort]
        firstRequest.predicate = NSPredicate(format: "messageDateCreated < %@", firstMessageDate! as NSDate)
    } else {
        let dateSort = NSSortDescriptor(key: "messageDateCreated", ascending: false)
        firstRequest.sortDescriptors = [dateSort]
    }

    firstRequest.fetchLimit = 1
    firstRequest.fetchOffset = 80

    do {
        let fetchedResults = try context.fetch(firstRequest)
        firstMessageDate = fetchedResults.first?.messageDateCreated
    } catch {
        print("Could not fetch \(error)")
    }


    let request:NSFetchRequest<Message> = Message.fetchRequest()

    let dateSort = NSSortDescriptor(key: "messageDateCreated", ascending: true)
    request.sortDescriptors = [dateSort]

    request.predicate = NSPredicate(format: "messageDateCreated > %@", firstMessageDate! as NSDate)

    fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: "messageDateSectionIdentifier", cacheName: nil)

    fetchedResultsController.delegate = self

    do {
        try fetchedResultsController.performFetch()
        self.tableView.reloadData()

    } catch {
        fatalError("Failed to initialize FetchedResultsController: \(error)")
    }
}

这是我的scrollView委托:

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        if scrollView.contentOffset.y < 0 {
            initializeResultsController()
        }
    }