Created
January 12, 2020 15:29
-
-
Save sathishvgs/c80d9573c01f85c9484f812de3be5f79 to your computer and use it in GitHub Desktop.
NsFetchedResultsController BatchUpdates
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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