         updateNoResultsLabel()
     }
 
-    func performBatchUpdates(_ block: @escaping () -> Void) {
-        self.collectionView.performBatchUpdates(block, completion: nil)
+    @discardableResult
+    func performBatchUpdates(_ block: @escaping () -> Void) -> Promise<Void> {
+        let (promise, fulfill, _) = Promise<Void>.pending()
+
+        // don't perform a batch update if a full reload is pending
+        guard !shouldReload else {
+            fulfill(())
+            return promise
+        }
+
+        collectionView.performBatchUpdates(block, completion: { _ in
+            fulfill(())
+        })
+        return promise
     }
 
     fileprivate var debounceCellReload = debounce(0.05)

            shouldReload = true
            return
        }
        shouldReload = false

        if now {
            debounceCellReload {}
            self.collectionView.reloadData()
            self.collectionView.layoutIfNeeded()
        }
        else {
            debounceCellReload { [weak self] in
                guard let `self` = self else { return }

                self.collectionView.reloadData()
                self.collectionView.layoutIfNeeded()
            }
        }
    }

import SwiftyUserDefaults
import DeltaCalculator
import SnapKit
import PromiseKit


// MARK: Responder Implementations
