Merge branch 'bugfix/table_refresh_crash' into 'develop'
Move dispatch to always happen for refresh See merge request BPHV_MIPS/mvm_core_ui!747
This commit is contained in:
commit
50d30b08e5
@ -173,11 +173,6 @@ open class MoleculeListTemplate: ThreeLayerTableViewController, TemplateProtocol
|
|||||||
cell.didDeselectCell(at: indexPath, delegateObject: delegateObject() as? MVMCoreUIDelegateObject, additionalData: nil)
|
cell.didDeselectCell(at: indexPath, delegateObject: delegateObject() as? MVMCoreUIDelegateObject, additionalData: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func performTableViewUpdates() {
|
|
||||||
tableView.beginUpdates()
|
|
||||||
tableView.endUpdates()
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - MoleculeDelegateProtocol
|
// MARK: - MoleculeDelegateProtocol
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -187,7 +182,7 @@ open class MoleculeListTemplate: ThreeLayerTableViewController, TemplateProtocol
|
|||||||
|
|
||||||
let point = molecule.convert(molecule.bounds.origin, to: tableView)
|
let point = molecule.convert(molecule.bounds.origin, to: tableView)
|
||||||
if let indexPath = tableView.indexPathForRow(at: point), tableView.indexPathsForVisibleRows?.contains(indexPath) ?? false {
|
if let indexPath = tableView.indexPathForRow(at: point), tableView.indexPathsForVisibleRows?.contains(indexPath) ?? false {
|
||||||
performTableViewUpdates()
|
refreshTable()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -305,25 +300,22 @@ extension MoleculeListTemplate: MoleculeListProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
open func addMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], indexPath: IndexPath, animation: UITableView.RowAnimation?) {
|
open func addMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], indexPath: IndexPath, animation: UITableView.RowAnimation?) {
|
||||||
// This dispatch is needed to fix a race condition that can occur if this function is called during the table setup.
|
var indexPaths: [IndexPath] = []
|
||||||
DispatchQueue.main.async {
|
|
||||||
var indexPaths: [IndexPath] = []
|
|
||||||
|
|
||||||
for molecule in molecules {
|
for molecule in molecules {
|
||||||
if let info = self.createMoleculeInfo(with: molecule) {
|
if let info = self.createMoleculeInfo(with: molecule) {
|
||||||
self.tableView?.register(info.class, forCellReuseIdentifier: info.identifier)
|
self.tableView?.register(info.class, forCellReuseIdentifier: info.identifier)
|
||||||
let index = indexPath.row + indexPaths.count
|
let index = indexPath.row + indexPaths.count
|
||||||
self.moleculesInfo?.insert(info, at: index)
|
self.moleculesInfo?.insert(info, at: index)
|
||||||
indexPaths.append(IndexPath(row: index, section: 0))
|
indexPaths.append(IndexPath(row: index, section: 0))
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
guard let animation = animation,
|
|
||||||
indexPaths.count > 0 else { return }
|
|
||||||
self.tableView?.insertRows(at: indexPaths, with: animation)
|
|
||||||
self.updateViewConstraints()
|
|
||||||
self.view.layoutIfNeeded()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
guard let animation = animation,
|
||||||
|
indexPaths.count > 0 else { return }
|
||||||
|
self.tableView?.insertRows(at: indexPaths, with: animation)
|
||||||
|
self.updateViewConstraints()
|
||||||
|
self.view.layoutIfNeeded()
|
||||||
}
|
}
|
||||||
|
|
||||||
open func getIndexPath(for molecule: ListItemModelProtocol & MoleculeModelProtocol) -> IndexPath? {
|
open func getIndexPath(for molecule: ListItemModelProtocol & MoleculeModelProtocol) -> IndexPath? {
|
||||||
|
|||||||
@ -83,8 +83,11 @@ open class ProgrammaticTableViewController: ProgrammaticScrollViewController, UI
|
|||||||
}
|
}
|
||||||
|
|
||||||
open func refreshTable() {
|
open func refreshTable() {
|
||||||
tableView.beginUpdates()
|
// Perform asyncronously to ensure it can never run in the same process as table data updates.
|
||||||
tableView.endUpdates()
|
DispatchQueue.main.async { [self] in
|
||||||
|
tableView.beginUpdates()
|
||||||
|
tableView.endUpdates()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// For subclassing, returns the number of sections for table. This function calls numberOfSectionsForTableview aftre ensuring the table is setup properly.
|
/// For subclassing, returns the number of sections for table. This function calls numberOfSectionsForTableview aftre ensuring the table is setup properly.
|
||||||
|
|||||||
@ -132,9 +132,7 @@ open class ThreeLayerTableViewController: ProgrammaticTableViewController {
|
|||||||
bottomViewTopConstraint?.constant = newSpace
|
bottomViewTopConstraint?.constant = newSpace
|
||||||
showFooter(width)
|
showFooter(width)
|
||||||
}
|
}
|
||||||
DispatchQueue.main.async {
|
refreshTable()
|
||||||
self.refreshTable()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
super.updateViewConstraints()
|
super.updateViewConstraints()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -270,9 +270,7 @@ import UIKit
|
|||||||
bottomBar?.frame = CGRect(x: 0, y: bounds.height - size, width: bounds.width, height: size)
|
bottomBar?.frame = CGRect(x: 0, y: bounds.height - size, width: bounds.width, height: size)
|
||||||
|
|
||||||
if updateMoleculeLayout || heightChanged {
|
if updateMoleculeLayout || heightChanged {
|
||||||
DispatchQueue.main.async { [self] in
|
delegateObject?.moleculeDelegate?.moleculeLayoutUpdated(self)
|
||||||
delegateObject?.moleculeDelegate?.moleculeLayoutUpdated(self)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setNeedsDisplay()
|
setNeedsDisplay()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user