         return TopTabChangeSet(reloadArr: reloads, insertArr: inserts, deleteArr: deletes, moveArr: moves)
     }
 
-    func updateTabsFrom(_ oldTabs: [Tab]?, to newTabs: [Tab], on completion: (() -> Void)? = nil) {
+    func updateTabsFrom(_ oldTabs: [Tab]?, to newTabs: [Tab]) {
         assertIsMainThread("Updates can only be performed from the main thread")
         guard let oldTabs = oldTabs, !self.isUpdating, !self.pendingReloadData, !self.isDragging else {
             return
+        }
+
+        func performPendingCompletions() {
+            for block in self.completionBlocks {
+                block()
+            }
+            self.completionBlocks.removeAll()
         }
 
         // Lets create our change set


        // If there are no changes. We have nothing to do
        if update.isEmpty {
            completion?()
            return
        }


        self.pendingUpdatesToTabs = newTabs // This var helps other mutations that might happen while updating.

        let onComplete: () -> Void = {
            performPendingCompletions()
            self.isUpdating = false
            self.pendingUpdatesToTabs = []
            // run completion blocks
