diff --git a/Sources/DiffableDataSource.BaseAdapter.swift b/Sources/DiffableDataSource.BaseAdapter.swift index bf04b22..e3ffb46 100644 --- a/Sources/DiffableDataSource.BaseAdapter.swift +++ b/Sources/DiffableDataSource.BaseAdapter.swift @@ -116,10 +116,10 @@ extension DiffableDataSource { target.reload( using: changeset, animated: animatingDifferences, - setData: setSections + setData: setSections, + completion: completion ) - }, - completion: completion + } ) } @@ -148,10 +148,10 @@ extension DiffableDataSource { target.reload( using: changeset, animated: animatingDifferences, - setData: setSections + setData: setSections, + completion: completion ) - }, - completion: completion + } ) } diff --git a/Sources/DiffableDataSource.CollectionViewAdapter-AppKit.swift b/Sources/DiffableDataSource.CollectionViewAdapter-AppKit.swift index d533af4..4742cec 100644 --- a/Sources/DiffableDataSource.CollectionViewAdapter-AppKit.swift +++ b/Sources/DiffableDataSource.CollectionViewAdapter-AppKit.swift @@ -207,9 +207,9 @@ extension DiffableDataSource { self.base?.moveItem(at: indexPath, to: newIndexPath) } - public func performBatchUpdates(updates: () -> Void, animated: Bool) { + public func performBatchUpdates(updates: () -> Void, animated: Bool, completion: @escaping () -> Void) { - self.base?.animator().performBatchUpdates(updates, completionHandler: nil) + self.base?.animator().performBatchUpdates(updates, completionHandler: { _ in completion() }) } public func reloadData() { diff --git a/Sources/DiffableDataSource.CollectionViewAdapter-UIKit.swift b/Sources/DiffableDataSource.CollectionViewAdapter-UIKit.swift index 2294f1f..3e2f5f6 100644 --- a/Sources/DiffableDataSource.CollectionViewAdapter-UIKit.swift +++ b/Sources/DiffableDataSource.CollectionViewAdapter-UIKit.swift @@ -207,9 +207,9 @@ extension DiffableDataSource { self.base?.moveItem(at: indexPath, to: newIndexPath) } - public func performBatchUpdates(updates: () -> Void, animated: Bool) { + public func performBatchUpdates(updates: () -> Void, animated: Bool, completion: @escaping () -> Void) { - self.base?.performBatchUpdates(updates, completion: nil) + self.base?.performBatchUpdates(updates, completion: { _ in completion() }) } public func reloadData() { diff --git a/Sources/DiffableDataSource.TableViewAdapter-UIKit.swift b/Sources/DiffableDataSource.TableViewAdapter-UIKit.swift index 88a6ad9..117e9d3 100644 --- a/Sources/DiffableDataSource.TableViewAdapter-UIKit.swift +++ b/Sources/DiffableDataSource.TableViewAdapter-UIKit.swift @@ -241,13 +241,13 @@ extension DiffableDataSource { self.base?.moveRow(at: indexPath, to: newIndexPath) } - public func performBatchUpdates(updates: () -> Void, animated: Bool) { + public func performBatchUpdates(updates: () -> Void, animated: Bool, completion: @escaping () -> Void) { guard let base = self.base else { return } - base.performBatchUpdates(updates) + base.performBatchUpdates(updates, completion: { _ in completion() }) } public func reloadData() { diff --git a/Sources/DiffableDataSource.Target.swift b/Sources/DiffableDataSource.Target.swift index 9b1ba16..8408444 100644 --- a/Sources/DiffableDataSource.Target.swift +++ b/Sources/DiffableDataSource.Target.swift @@ -98,7 +98,7 @@ public protocol DiffableDataSourceTarget { /** Animates multiple insert, delete, reload, and move operations as a group. */ - func performBatchUpdates(updates: () -> Void, animated: Bool) + func performBatchUpdates(updates: () -> Void, animated: Bool, completion: @escaping () -> Void) /** Reloads all sections and items. @@ -114,9 +114,15 @@ extension DiffableDataSource.Target { using stagedChangeset: Internals.DiffableDataUIDispatcher.StagedChangeset, animated: Bool, interrupt: ((Internals.DiffableDataUIDispatcher.Changeset) -> Bool)? = nil, - setData: (C) -> Void + setData: (C) -> Void, + completion: @escaping () -> Void ) { + let group = DispatchGroup() + defer { + + group.notify(queue: .main, execute: completion) + } if self.shouldSuspendBatchUpdates, let data = stagedChangeset.last?.data { setData(data) @@ -133,6 +139,7 @@ extension DiffableDataSource.Target { self.reloadData() return } + group.enter() self.performBatchUpdates( updates: { @@ -206,7 +213,8 @@ extension DiffableDataSource.Target { ) } }, - animated: animated + animated: animated, + completion: group.leave ) } } diff --git a/Sources/Internals.DiffableDataUIDispatcher.swift b/Sources/Internals.DiffableDataUIDispatcher.swift index a09202c..acde1bf 100644 --- a/Sources/Internals.DiffableDataUIDispatcher.swift +++ b/Sources/Internals.DiffableDataUIDispatcher.swift @@ -59,16 +59,14 @@ extension Internals { Target, StagedChangeset<[Internals.DiffableDataSourceSnapshot.Section]>, @escaping ([Internals.DiffableDataSourceSnapshot.Section]) -> Void - ) -> Void, - completion: @escaping () -> Void + ) -> Void ) { self.apply( .init(), target: target, animatingDifferences: animatingDifferences, - performUpdates: performUpdates, - completion: completion + performUpdates: performUpdates ) } @@ -80,8 +78,7 @@ extension Internals { Target, StagedChangeset<[Internals.DiffableDataSourceSnapshot.Section]>, @escaping ([Internals.DiffableDataSourceSnapshot.Section]) -> Void - ) -> Void, - completion: @escaping () -> Void + ) -> Void ) { self.dispatcher.dispatch { [weak self] in @@ -112,7 +109,6 @@ extension Internals { #if canImport(QuartzCore) CATransaction.begin() - CATransaction.setCompletionBlock(completion) if !animatingDifferences { @@ -122,11 +118,9 @@ extension Internals { CATransaction.commit() - #else performDiffingUpdates() - completion() #endif