From a1c6332131d391adddb3903b2c27f31944655bb1 Mon Sep 17 00:00:00 2001 From: Xi Zhang Date: Mon, 17 Jun 2024 20:39:39 -0400 Subject: [PATCH 1/4] Add support for removing persistent cache properly. --- MVMCore/MVMCore/OtherHandlers/MVMCoreCache.h | 6 ++++++ MVMCore/MVMCore/OtherHandlers/MVMCoreCache.m | 12 ++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.h b/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.h index 5d2a48c..e4680b0 100644 --- a/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.h +++ b/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.h @@ -147,6 +147,12 @@ typedef void(^MVMCoreGetImageBlock)(UIImage * _Nullable, NSData * _Nullable, BOO /// Clears the persistent JSON cache - (void)clearPersistentJSONCache; +// Removes a json dictionary from the cache by pageType. +- (void)removePersistentJSONCacheForPageType:(nonnull NSString *)pageType pageJSON:(nonnull NSDictionary *)jsonDictionary; + +// Removes a json dictionary from the cache by pageType. +- (void)removePersistentModuleCacheForModule:(nonnull NSString *)moduleType moduleJSON:(nonnull NSDictionary *)jsonDictionary; + #pragma mark Image Functions /// Register a bundle as one to search for images in. diff --git a/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.m b/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.m index 4f90380..60ad720 100644 --- a/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.m +++ b/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.m @@ -181,6 +181,14 @@ static NSString * const STATIC_CACHE_COMPONENT = @"StaticCache.txt"; return [[PersistentCacheManager shared] loadForKey:moduleName path:[self getPathForPersistentCacheModule:moduleName] error:&error]; } +- (void)removePersistentJSONCacheForPageType:(nonnull NSString *)pageType pageJSON:(nonnull NSDictionary *)jsonDictionary { + [[PersistentCacheManager shared] removeForKey:pageType error:nil]; +} + +- (void)removePersistentModuleCacheForModule:(nonnull NSString *)moduleType moduleJSON:(nonnull NSDictionary *)jsonDictionary { + [[PersistentCacheManager shared] removeForKey:moduleType error:nil]; +} + #pragma mark - Advanced Fetch - (void)fetchJSONForPageType:(nullable NSString *)pageType queue:(nullable NSOperationQueue *)queue waitUntilFinished:(BOOL)waitUntilFinished completionHandler:(nonnull void (^)(NSDictionary * _Nullable jsonDictionary))completionHandler { @@ -315,7 +323,7 @@ static NSString * const STATIC_CACHE_COMPONENT = @"StaticCache.txt"; [weakSelf.pageTypeCache setObject:jsonDictionary forKey:pageType]; if (![self shouldPersistentlyCachePage:jsonDictionary pageType:pageType]) { - [[PersistentCacheManager shared] removeForKey:pageType error:nil]; + [self removePersistentJSONCacheForPageType:pageType pageJSON:jsonDictionary]; return; } [self addPageToPersistentCache:jsonDictionary pageType:pageType expirationDate:[self getExpirationDateForJSON:jsonDictionary]]; @@ -351,7 +359,7 @@ static NSString * const STATIC_CACHE_COMPONENT = @"StaticCache.txt"; [weakSelf.moduleCache setObject:jsonDictionary forKey:module]; if (![self shouldPersistentlyCacheModule:jsonDictionary module:module]) { - [[PersistentCacheManager shared] removeForKey:module error:nil]; + [self removePersistentModuleCacheForModule:module moduleJSON:jsonDictionary]; return; } [self addModuleToPersistentCache:jsonDictionary moduleName:module expirationDate:[self getExpirationDateForJSON:jsonDictionary]]; From 25e05c6c531327672c42d144579c8a5fdb3aa8cf Mon Sep 17 00:00:00 2001 From: Xi Zhang Date: Mon, 17 Jun 2024 20:55:20 -0400 Subject: [PATCH 2/4] update API description. --- MVMCore/MVMCore/OtherHandlers/MVMCoreCache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.h b/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.h index e4680b0..fabbe59 100644 --- a/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.h +++ b/MVMCore/MVMCore/OtherHandlers/MVMCoreCache.h @@ -150,7 +150,7 @@ typedef void(^MVMCoreGetImageBlock)(UIImage * _Nullable, NSData * _Nullable, BOO // Removes a json dictionary from the cache by pageType. - (void)removePersistentJSONCacheForPageType:(nonnull NSString *)pageType pageJSON:(nonnull NSDictionary *)jsonDictionary; -// Removes a json dictionary from the cache by pageType. +// Removes a json dictionary from the cache by moduleType. - (void)removePersistentModuleCacheForModule:(nonnull NSString *)moduleType moduleJSON:(nonnull NSDictionary *)jsonDictionary; #pragma mark Image Functions From 3054f7e62da8ab8d757c61bc18b28e003ec41b10 Mon Sep 17 00:00:00 2001 From: Scott Pfeil Date: Tue, 18 Jun 2024 10:33:01 -0400 Subject: [PATCH 3/4] Digital PCT265 defect CXTDT-573619 - Add a flag to create a new controller instead of go to --- .../MVMCoreLoadRequestOperation+Extension.swift | 5 +++-- .../MVMCore/LoadHandling/MVMCoreRequestParameters.h | 5 +++++ .../MVMCore/LoadHandling/MVMCoreRequestParameters.m | 2 ++ .../Helpers/MVMCoreActionUtility+Extension.swift | 10 +++++----- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation+Extension.swift b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation+Extension.swift index 53a0e86..1917fbc 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation+Extension.swift +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation+Extension.swift @@ -44,8 +44,9 @@ public extension MVMCoreLoadRequestOperation { @MainActor func goToViewController(loadObject: MVMCoreLoadObject) async -> UIViewController? { guard loadObject.requestParameters?.replaceViewIfOnStackElseLoadWithStyle == true, - let pageType = loadObject.pageType else { - MVMCoreLoggingHandler.logDebugMessage(withDelegate: "\(type(of: self)): A new controller should be made and any existing shouldn't be replaced. pageType:\(String(describing: loadObject.pageType))") + loadObject.requestParameters?.replaceViewControllerIfOnStackGoToOnly == true, + let pageType = loadObject.pageType else { + MVMCoreLoggingHandler.logDebugMessage(withDelegate: "\(type(of: self)): A new controller should be made. pageType:\(String(describing: loadObject.pageType))") return nil } let template = loadObject.pageJSON?.optionalStringForKey("template") diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.h b/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.h index 28d7f2d..df31432 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.h +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.h @@ -79,8 +79,13 @@ typedef NS_ENUM(NSInteger, MFLoadStyle) { // Determines how it is loaded. @property (nonatomic) MFLoadStyle loadStyle; + +/// Determines if we should search the stack for a controller with the same pageType or just load a new controller with style. Default true @property (nonatomic) BOOL replaceViewIfOnStackElseLoadWithStyle; +/// Determines if, when replaceViewIfOnStackElseLoadWithStyle is true, we should create a new controller or only pop back to the existing controller. Default true +@property (nonatomic) BOOL replaceViewControllerIfOnStackGoToOnly; + // A flag for if a tab was pressed to cause this load. This will ensure that we do not load a new tab page. @property (nonatomic) BOOL tabWasPressed; diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.m b/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.m index 64d5abd..fa0d947 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.m @@ -29,6 +29,7 @@ // Default load style. self.loadStyle = MFLoadStyleDefault; self.replaceViewIfOnStackElseLoadWithStyle = YES; + self.replaceViewControllerIfOnStackGoToOnly = YES; self.identifier = [[NSUUID UUID] UUIDString]; } return self; @@ -189,6 +190,7 @@ copyObject.contextRoot = [self.contextRoot copy]; copyObject.loadStyle = self.loadStyle; copyObject.replaceViewIfOnStackElseLoadWithStyle = self.replaceViewIfOnStackElseLoadWithStyle; + copyObject.replaceViewControllerIfOnStackGoToOnly = self.replaceViewControllerIfOnStackGoToOnly; copyObject.noViewControllerToLoad = self.noViewControllerToLoad; copyObject.dontDisplayViewController = self.dontDisplayViewController; copyObject.noloadingOverlay = self.noloadingOverlay; diff --git a/MVMCore/MVMCore/Utility/Helpers/MVMCoreActionUtility+Extension.swift b/MVMCore/MVMCore/Utility/Helpers/MVMCoreActionUtility+Extension.swift index bb6e590..ac1009e 100644 --- a/MVMCore/MVMCore/Utility/Helpers/MVMCoreActionUtility+Extension.swift +++ b/MVMCore/MVMCore/Utility/Helpers/MVMCoreActionUtility+Extension.swift @@ -89,21 +89,21 @@ public extension NavigationHandler { switch requestParameters.loadStyle { case .replaceCurrent: guard let navigationController = requestParameters.navigationController ?? NavigationHandler.shared().navigationController else { return nil } - return NavigationOperation(with: .replace(viewController: viewController, navigationController: navigationController, animated: shouldAnimate), tryToReplace: true, delegate: delegateObject?.presentationDelegate) + return NavigationOperation(with: .replace(viewController: viewController, navigationController: navigationController, animated: shouldAnimate), tryToReplace: requestParameters.replaceViewIfOnStackElseLoadWithStyle, delegate: delegateObject?.presentationDelegate) case .onTopOfRoot: guard let navigationController = requestParameters.navigationController ?? NavigationHandler.shared().navigationController, let root = navigationController.viewControllers.first else { return nil } let viewControllers = [root, viewController] - return NavigationOperation(with: .set(viewControllers: viewControllers, navigationController: navigationController, animated: shouldAnimate), tryToReplace: true, delegate: delegateObject?.presentationDelegate) + return NavigationOperation(with: .set(viewControllers: viewControllers, navigationController: navigationController, animated: shouldAnimate), tryToReplace: requestParameters.replaceViewIfOnStackElseLoadWithStyle, delegate: delegateObject?.presentationDelegate) case .becomeRoot: guard let navigationController = requestParameters.navigationController ?? NavigationHandler.shared().navigationController else { return nil } - return NavigationOperation(with: .set(viewControllers: [viewController], navigationController: navigationController, animated: shouldAnimate), tryToReplace: true, delegate: delegateObject?.presentationDelegate) + return NavigationOperation(with: .set(viewControllers: [viewController], navigationController: navigationController, animated: shouldAnimate), tryToReplace: requestParameters.replaceViewIfOnStackElseLoadWithStyle, delegate: delegateObject?.presentationDelegate) case .present: guard let viewControllerToPresentOn = getViewControllerToPresentOn() else { return nil } - return NavigationOperation(with: .present(viewController: viewController, onController: viewControllerToPresentOn, animated: shouldAnimate), tryToReplace: true, delegate: delegateObject?.presentationDelegate) + return NavigationOperation(with: .present(viewController: viewController, onController: viewControllerToPresentOn, animated: shouldAnimate), tryToReplace: requestParameters.replaceViewIfOnStackElseLoadWithStyle, delegate: delegateObject?.presentationDelegate) default: guard let navigationController = requestParameters.navigationController ?? NavigationHandler.shared().navigationController else { return nil } - return NavigationOperation(with: .push(viewController: viewController, navigationController: navigationController, animated: shouldAnimate), tryToReplace: true, delegate: delegateObject?.presentationDelegate) + return NavigationOperation(with: .push(viewController: viewController, navigationController: navigationController, animated: shouldAnimate), tryToReplace: requestParameters.replaceViewIfOnStackElseLoadWithStyle, delegate: delegateObject?.presentationDelegate) } } From c18ce5e811122480a7c071d5c08d0ead831ef408 Mon Sep 17 00:00:00 2001 From: "Hedden, Kyle Matthew" Date: Fri, 21 Jun 2024 10:27:12 -0400 Subject: [PATCH 4/4] Digital PCT265 defect CXTDT-574791: Prevent crash when modifying the controller array slice. --- .../MVMCore/PresentationHandling/NavigationOperation.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MVMCore/MVMCore/PresentationHandling/NavigationOperation.swift b/MVMCore/MVMCore/PresentationHandling/NavigationOperation.swift index a6aa16c..d8aef54 100644 --- a/MVMCore/MVMCore/PresentationHandling/NavigationOperation.swift +++ b/MVMCore/MVMCore/PresentationHandling/NavigationOperation.swift @@ -68,9 +68,9 @@ open class NavigationOperation: MVMCoreOperation, UINavigationControllerDelegate let index = navigationController.getIndexOfViewController(with: pageType) else { return false } - var viewControllers = navigationController.viewControllers[...index] + var viewControllers = Array(navigationController.viewControllers[...index]) viewControllers[index] = viewController - set(viewControllers: Array(viewControllers), navigationController: navigationController, animated: animated) + set(viewControllers: viewControllers, navigationController: navigationController, animated: animated) return true }