         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)

        }
    }

    func appendUnsizedCellItems(_ items: [StreamCellItem], completion: StreamDataSource.StreamContentReady? = nil) {
        let width = view.frame.width
        blockReload()
        dataSource.calculateCellItems(items, withWidth: width) {
            var indexPaths: [IndexPath]!
            self.performBatchUpdates {
                indexPaths = self.dataSource.appendStreamCellItems(items)
                self.collectionView.insertItems(at: indexPaths)
            }
            self.unblockReload()
            self.doneLoading()
            completion?(indexPaths)
        }
    }

    func insertUnsizedCellItems(_ cellItems: [StreamCellItem], startingIndexPath: IndexPath, completion: @escaping Block = {}) {
        let width = view.frame.width
        blockReload()
        dataSource.calculateCellItems(cellItems, withWidth: width) {
            self.performBatchUpdates {
                let indexPaths = self.dataSource.insertStreamCellItems(cellItems, startingIndexPath: startingIndexPath)
                self.collectionView.insertItems(at: indexPaths)
            }
            self.unblockReload()
            completion()
        }
    }


            items = [item]
        }

        self.appendUnsizedCellItems(items) {
            animate {
                if let streamableViewController = self.parent as? StreamableViewController {
                    streamableViewController.trackScreenAppeared()
