我有一个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()
}
}