DifferenceTracker is a lightweight extension to Swift's CollectionDifference
. It defines
moves in addition to removals and insertions, critical when updating interfaces and managing
reference types.
DifferenceTracker can be used to perform animated updates on NSTableViews
and NSOutlineViews
between beginUpdates()
/ endUpdates()
calls. This does not currently support updating
UITableView
, UICollectionView
or NSCollectionView
within a performBatchUpdates()
call,
which requires subtly different ordering.
DifferenceTracker generates an array of steps that can be applied iteratively to an interface, or associated collection, to move, insert and remove elements. Apart from the first and last steps, all step indexes are transient and do not relate directly to the start or end collections.
outlineView.beginUpdates()
for step in collectionDifference.steps {
switch step {
case let .remove(_, index):
outlineView.removeItems(at: [index], inParent: node, withAnimation: animation)
case let .insert(element, index):
outlineView.insertItems(at: [index], inParent: node, withAnimation: animation)
case let .move(element, from, to):
outlineView.moveItem(at: from, inParent: node, to: to, inParent: node)
}
}
outlineView.endUpdates()
DifferenceTracker development was aided by @paxos and his thorough test suite. Thank you.