Skip to content

Instantly share code, notes, and snippets.

@sathishvgs
Created January 12, 2020 15:29
Show Gist options
  • Save sathishvgs/c80d9573c01f85c9484f812de3be5f79 to your computer and use it in GitHub Desktop.
Save sathishvgs/c80d9573c01f85c9484f812de3be5f79 to your computer and use it in GitHub Desktop.
NsFetchedResultsController BatchUpdates
private var sectionChanges: Array<Dictionary<NSFetchedResultsChangeType, Int>> = []
private var itemChanges: Array<Dictionary<NSFetchedResultsChangeType, [IndexPath]>> = []
extension AwChatPresenterImplementation: NSFetchedResultsControllerDelegate {
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
if controller == chatFetchResultController {
sectionChanges = []
itemChanges = []
}
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
if controller == chatFetchResultController {
awChatView.chatTableNode.performBatchUpdates({ [weak self] in
guard let `self` = self else { return }
for change in sectionChanges {
for (key, value) in change {
switch key {
case .insert:
self.awChatView.chatTableNode.insertSections(NSIndexSet(index: value) as IndexSet, with: .fade)
case .delete:
self.awChatView.chatTableNode.deleteSections(NSIndexSet(index: value) as IndexSet, with: .fade)
case .update:
self.awChatView.chatTableNode.reloadSections(NSIndexSet(index: value) as IndexSet, with: .fade)
case .move:
self.awChatView.chatTableNode.deleteSections(NSIndexSet(index: value) as IndexSet, with: .fade)
self.awChatView.chatTableNode.insertSections(NSIndexSet(index: value) as IndexSet, with: .fade)
}
}
}
for change in itemChanges {
for (key, value) in change {
switch key {
case .insert:
self.awChatView.chatTableNode.insertRows(at: value, with: .fade)
case .delete:
self.awChatView.chatTableNode.deleteRows(at: value, with: .fade)
case .update:
self.awChatView.chatTableNode.reloadRows(at: value, with: .fade)
case .move:
guard let atIndexPath = value[safe: 0], let toIndexPath = value[safe: 1] else { return }
self.awChatView.chatTableNode.moveRow(at: atIndexPath, to: toIndexPath)
}
}
}
}, completion: { _ in
self.sectionChanges = []
self.itemChanges = []
})
}
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange sectionInfo: NSFetchedResultsSectionInfo, atSectionIndex sectionIndex: Int, for type: NSFetchedResultsChangeType) {
let change = [type: sectionIndex]
sectionChanges.append(change)
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
var change: [NSFetchedResultsChangeType: [IndexPath]] = [:]
switch type {
case .insert:
guard let newIndexPath = newIndexPath else { return }
change[type] = [newIndexPath]
case .delete:
guard let indexPath = indexPath else { return }
change[type] = [indexPath]
case .update:
/* called when cell editing- not happening
called when read,delivery status changes
*/
guard let indexPath = indexPath else { return }
change[type] = [indexPath]
case .move:
/* Move called when ever chat edited
called when inserting new cell - bug
*/
guard let deleteIndexPath = indexPath, let insertIndexPath = newIndexPath, deleteIndexPath == insertIndexPath else { return }
change[type] = [deleteIndexPath, insertIndexPath]
}
itemChanges.append(change)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment