Fix issue where deletes were crashing the app. Issue #702

This commit is contained in:
Maurice Parker 2019-06-05 17:42:35 -05:00
parent e428a4f785
commit e8992dac95
2 changed files with 37 additions and 8 deletions

View File

@ -46,12 +46,30 @@ final class DeleteCommand: UndoableCommand {
func perform() { func perform() {
BatchUpdate.shared.perform { BatchUpdate.shared.perform {
itemSpecifiers.forEach { $0.delete() } itemSpecifiers.forEach { $0.delete() {} }
treeController.rebuild() treeController.rebuild()
} }
registerUndo() 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() { func undo() {
BatchUpdate.shared.perform { BatchUpdate.shared.perform {
@ -132,18 +150,20 @@ private struct SidebarItemSpecifier {
self.path = ContainerPath(account: account!, folders: node.containingFolders()) self.path = ContainerPath(account: account!, folders: node.containingFolders())
} }
func delete() { func delete(completion: @escaping () -> Void) {
if let feed = feed { if let feed = feed {
BatchUpdate.shared.start() BatchUpdate.shared.start()
account?.removeFeed(feed, from: path.resolveContainer()) { result in account?.removeFeed(feed, from: path.resolveContainer()) { result in
BatchUpdate.shared.end() BatchUpdate.shared.end()
completion()
self.checkResult(result) self.checkResult(result)
} }
} else if let folder = folder { } else if let folder = folder {
BatchUpdate.shared.start() BatchUpdate.shared.start()
account?.removeFolder(folder) { result in account?.removeFolder(folder) { result in
BatchUpdate.shared.end() BatchUpdate.shared.end()
completion()
self.checkResult(result) self.checkResult(result)
} }
} }

View File

@ -526,14 +526,23 @@ class MasterFeedViewController: ProgressTableViewController, UndoableCommandRunn
else { else {
return return
} }
navState.beginUpdates()
runCommand(deleteCommand) var deleteIndexPaths = [indexPath]
navState.rebuildShadowTable() if navState.isExpanded(deleteNode) {
tableView.deleteRows(at: [indexPath], with: .automatic) 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()
}
} }