From e8992dac95ea819162bdfbf2d10258542cd311ab Mon Sep 17 00:00:00 2001 From: Maurice Parker <mo@vincode.io> Date: Wed, 5 Jun 2019 17:42:35 -0500 Subject: [PATCH] Fix issue where deletes were crashing the app. Issue #702 --- Shared/Commands/DeleteCommand.swift | 24 +++++++++++++++++-- iOS/MasterFeed/MasterFeedViewController.swift | 21 +++++++++++----- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/Shared/Commands/DeleteCommand.swift b/Shared/Commands/DeleteCommand.swift index 6a8a15a5d..cb7f6f3cc 100644 --- a/Shared/Commands/DeleteCommand.swift +++ b/Shared/Commands/DeleteCommand.swift @@ -46,12 +46,30 @@ final class DeleteCommand: UndoableCommand { func perform() { BatchUpdate.shared.perform { - itemSpecifiers.forEach { $0.delete() } + itemSpecifiers.forEach { $0.delete() {} } treeController.rebuild() } registerUndo() } + func perform(completion: @escaping () -> Void) { + + let group = DispatchGroup() + group.enter() + itemSpecifiers.forEach { + $0.delete() { + group.leave() + } + } + treeController.rebuild() + + group.notify(queue: DispatchQueue.main) { + self.registerUndo() + completion() + } + + } + func undo() { BatchUpdate.shared.perform { @@ -132,18 +150,20 @@ private struct SidebarItemSpecifier { self.path = ContainerPath(account: account!, folders: node.containingFolders()) } - func delete() { + func delete(completion: @escaping () -> Void) { if let feed = feed { BatchUpdate.shared.start() account?.removeFeed(feed, from: path.resolveContainer()) { result in BatchUpdate.shared.end() + completion() self.checkResult(result) } } else if let folder = folder { BatchUpdate.shared.start() account?.removeFolder(folder) { result in BatchUpdate.shared.end() + completion() self.checkResult(result) } } diff --git a/iOS/MasterFeed/MasterFeedViewController.swift b/iOS/MasterFeed/MasterFeedViewController.swift index 4f01ed04d..809666f11 100644 --- a/iOS/MasterFeed/MasterFeedViewController.swift +++ b/iOS/MasterFeed/MasterFeedViewController.swift @@ -526,14 +526,23 @@ class MasterFeedViewController: ProgressTableViewController, UndoableCommandRunn else { return } - - navState.beginUpdates() - runCommand(deleteCommand) - navState.rebuildShadowTable() - tableView.deleteRows(at: [indexPath], with: .automatic) + var deleteIndexPaths = [indexPath] + if navState.isExpanded(deleteNode) { + for i in 0..<deleteNode.numberOfChildNodes { + deleteIndexPaths.append(IndexPath(row: indexPath.row + 1 + i, section: indexPath.section)) + } + } - navState.endUpdates() + pushUndoableCommand(deleteCommand) + + navState.beginUpdates() + deleteCommand.perform { + self.navState.treeController.rebuild() + self.navState.rebuildShadowTable() + self.tableView.deleteRows(at: deleteIndexPaths, with: .automatic) + self.navState.endUpdates() + } }