From 2dcbc9d41b64f61ffdfd53abe3ca8a44ebdc5d52 Mon Sep 17 00:00:00 2001 From: "Hedden, Kyle Matthew" Date: Tue, 11 Jun 2024 19:06:46 -0400 Subject: [PATCH] Digital PCT265 defect CXTDT-569436: Restore render dispatch in handleNewData. Add optional flag to disable in situations where we want to handle it ourselves. --- .../Atomic/Templates/CollectionTemplate.swift | 4 +-- .../Templates/ModalMoleculeListTemplate.swift | 4 +-- .../ModalMoleculeStackTemplate.swift | 4 +-- .../Templates/MoleculeListTemplate.swift | 4 +-- .../Templates/MoleculeStackTemplate.swift | 4 +-- .../BaseControllers/ViewController.swift | 27 ++++++++++++------- 6 files changed, 27 insertions(+), 20 deletions(-) diff --git a/MVMCoreUI/Atomic/Templates/CollectionTemplate.swift b/MVMCoreUI/Atomic/Templates/CollectionTemplate.swift index e9e8b46f..a88e223b 100644 --- a/MVMCoreUI/Atomic/Templates/CollectionTemplate.swift +++ b/MVMCoreUI/Atomic/Templates/CollectionTemplate.swift @@ -79,10 +79,10 @@ } - open override func handleNewData(_ pageModel: PageModelProtocol? = nil) { + open override func handleNewData(_ pageModel: PageModelProtocol? = nil, shouldTriggerRender: Bool = true) { setup() registerCells() - super.handleNewData(pageModel) + super.handleNewData(pageModel, shouldTriggerRender: shouldTriggerRender) } open override func updateUI(for molecules: [MoleculeModelProtocol]? = nil) { diff --git a/MVMCoreUI/Atomic/Templates/ModalMoleculeListTemplate.swift b/MVMCoreUI/Atomic/Templates/ModalMoleculeListTemplate.swift index 16afd5bd..e17eaf89 100644 --- a/MVMCoreUI/Atomic/Templates/ModalMoleculeListTemplate.swift +++ b/MVMCoreUI/Atomic/Templates/ModalMoleculeListTemplate.swift @@ -25,8 +25,8 @@ open class ModalMoleculeListTemplate: MoleculeListTemplate { try decoder.decode(ModalListPageTemplateModel.self, from: data) } - override open func handleNewData(_ pageModel: PageModelProtocol? = nil) { - super.handleNewData(pageModel) + override open func handleNewData(_ pageModel: PageModelProtocol? = nil, shouldTriggerRender: Bool = true) { + super.handleNewData(pageModel, shouldTriggerRender: shouldTriggerRender) closeButton = MVMCoreUICommonViewsUtility.addCloseButton(to: view, action: { [weak self] _ in guard let self = self else { return } diff --git a/MVMCoreUI/Atomic/Templates/ModalMoleculeStackTemplate.swift b/MVMCoreUI/Atomic/Templates/ModalMoleculeStackTemplate.swift index f3264b1b..5ca4616d 100644 --- a/MVMCoreUI/Atomic/Templates/ModalMoleculeStackTemplate.swift +++ b/MVMCoreUI/Atomic/Templates/ModalMoleculeStackTemplate.swift @@ -23,8 +23,8 @@ open class ModalMoleculeStackTemplate: MoleculeStackTemplate { // MARK: - Lifecycle //-------------------------------------------------- - override open func handleNewData(_ pageModel: PageModelProtocol? = nil) { - super.handleNewData(pageModel) + override open func handleNewData(_ pageModel: PageModelProtocol? = nil, shouldTriggerRender: Bool = true) { + super.handleNewData(pageModel, shouldTriggerRender: shouldTriggerRender) _ = MVMCoreUICommonViewsUtility.addCloseButton(to: view, action: { [weak self] _ in guard let self = self else { return } let closeAction = (self.templateModel as? ModalStackPageTemplateModel)?.closeAction ?? diff --git a/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift b/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift index 5eb23107..40bcd134 100644 --- a/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift +++ b/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift @@ -85,8 +85,8 @@ open class MoleculeListTemplate: ThreeLayerTableViewController, TemplateProtocol return view } - open override func handleNewData(_ pageModel: PageModelProtocol? = nil) { - super.handleNewData(pageModel) + open override func handleNewData(_ pageModel: PageModelProtocol? = nil, shouldTriggerRender: Bool = true) { + super.handleNewData(pageModel, shouldTriggerRender: shouldTriggerRender) if pageModel != nil { setup() diff --git a/MVMCoreUI/Atomic/Templates/MoleculeStackTemplate.swift b/MVMCoreUI/Atomic/Templates/MoleculeStackTemplate.swift index 8ce8cd67..bcfc2db4 100644 --- a/MVMCoreUI/Atomic/Templates/MoleculeStackTemplate.swift +++ b/MVMCoreUI/Atomic/Templates/MoleculeStackTemplate.swift @@ -20,10 +20,10 @@ open class MoleculeStackTemplate: ThreeLayerViewController, TemplateProtocol { // MARK: - Lifecycle //-------------------------------------------------- - open override func handleNewData(_ pageModel: PageModelProtocol? = nil) { + open override func handleNewData(_ pageModel: PageModelProtocol? = nil, shouldTriggerRender: Bool = true) { topViewOutsideOfScroll = templateModel?.anchorHeader ?? false bottomViewOutsideOfScroll = templateModel?.anchorFooter ?? false - super.handleNewData(pageModel) + super.handleNewData(pageModel, shouldTriggerRender: shouldTriggerRender) } // For subclassing the model. diff --git a/MVMCoreUI/BaseControllers/ViewController.swift b/MVMCoreUI/BaseControllers/ViewController.swift index dc2ed356..15b172ce 100644 --- a/MVMCoreUI/BaseControllers/ViewController.swift +++ b/MVMCoreUI/BaseControllers/ViewController.swift @@ -225,9 +225,9 @@ import MVMCore return navigationModel } - /// Processes any new data. Called after the page is loaded the first time and on response updates for this page. Triggers a render refresh. + /// Processes any new data. Called after the page is loaded the first time and on response updates for this page. Triggers a render refresh unless specified otherwise. @MainActor - open func handleNewData(_ pageModel: PageModelProtocol? = nil) { + open func handleNewData(_ pageModel: PageModelProtocol? = nil, shouldTriggerRender: Bool = true) { guard var newPageModel = pageModel ?? self.pageModel else { return } let originalModel = isFirstRender ? nil : self.pageModel as? MVMControllerModelProtocol @@ -279,13 +279,19 @@ import MVMCore // Notify the manager of new data. // Warning: Some flows cause table reloads. Until the UI update is decoupled, should be after the updateUI. manager?.newDataReceived?(in: self) - - if allUpdatedMolecules.isEmpty || isFirstRender { - debugLog("Performing full page render...") - updateUI() - } else { - debugLog("Performing partial render of \(allUpdatedMolecules) molecules...") - updateUI(for: allUpdatedMolecules) + + guard shouldTriggerRender else { return } + + // Dispatch to decouple execution. First massage data through template classes, then render. + Task { @MainActor in + + if allUpdatedMolecules.isEmpty || isFirstRender { + debugLog("Performing full page render...") + updateUI() + } else { + debugLog("Performing partial render of \(allUpdatedMolecules) molecules...") + updateUI(for: allUpdatedMolecules) + } } } @@ -399,7 +405,8 @@ import MVMCore initialLoad() } - handleNewData(pageModel) // Set outside shouldFinishProcessingLoad. + handleNewData(pageModel, shouldTriggerRender: false) // Set outside shouldFinishProcessingLoad. + updateUI() // Force the rendering on the same main UI thread. } open override func viewDidLayoutSubviews() {