Merge branch 'bugfix/async_and_warnings' into 'develop'

Bugfixes for getInitialParameters, completion block consolidation with async,...

### Summary
Bugfixes for getInitialParameters, completion block consolidation with async, and minor warning fixes

Co-authored-by: Scott Pfeil <Scott.Pfeil3@verizonwireless.com>

See merge request https://gitlab.verizon.com/BPHV_MIPS/mvm_core/-/merge_requests/278
This commit is contained in:
Pfeil, Scott Robert 2023-08-31 19:11:45 +00:00
commit e942bbfe15
6 changed files with 31 additions and 41 deletions

View File

@ -48,14 +48,14 @@
- (void)setHeadersForRequest:(nonnull NSMutableURLRequest *)request requestParameters:(nonnull MVMCoreRequestParameters *)requestParameters; - (void)setHeadersForRequest:(nonnull NSMutableURLRequest *)request requestParameters:(nonnull MVMCoreRequestParameters *)requestParameters;
// Converts the core request parameters into a JSON object dictionary. // Converts the core request parameters into a JSON object dictionary.
- (void)getJsonDictionary:(nonnull MVMCoreRequestParameters *)requestParameters closure:(nonnull void (^)(NSDictionary * _Nullable jsonDictionary))closure; - (void)getJsonDictionary:(nonnull MVMCoreRequestParameters *)requestParameters completion:(nonnull void (^)(NSDictionary * _Nullable jsonDictionary))completion;
- (void)getJsonData:(nonnull MVMCoreRequestParameters *)requestParameters forUrl:(nonnull NSURL *)url closure:(nonnull void (^)(NSData * _Nullable data, MVMCoreErrorObject *_Nullable error))closure; - (void)getJsonData:(nonnull MVMCoreRequestParameters *)requestParameters forUrl:(nonnull NSURL *)url completion:(nonnull void (^)(NSData * _Nullable data, MVMCoreErrorObject *_Nullable error))completion;
- (void)getInitialParametersExcludingSections:(NSSet<NSString *> *_Nullable)excludeSections closure:(nonnull void (^)(NSDictionary *_Nullable parameters))closure; - (void)getInitialParametersExcludingSections:(NSSet<NSString *> *_Nullable)excludeSections completion:(nonnull void (^)(NSDictionary *_Nullable parameters))completion NS_SWIFT_NAME(initialParameters(excludingSections:completion:));
// Creates a request object with the given parameters. // Creates a request object with the given parameters.
- (void)transformToRequestWithParameters:(nonnull MVMCoreRequestParameters *)requestParameters closure:(nonnull void (^)(NSURLRequest * _Nullable request, MVMCoreErrorObject *_Nullable error))closure; - (void)transformToRequestWithParameters:(nonnull MVMCoreRequestParameters *)requestParameters completion:(nonnull void (^)(NSURLRequest * _Nullable request, MVMCoreErrorObject *_Nullable error))completion;
// Sends a given request to the server. When it is finished, it calls request finished, passing along the json object or nil if there is an error. // Sends a given request to the server. When it is finished, it calls request finished, passing along the json object or nil if there is an error.
- (void)sendRequest:(nonnull MVMCoreRequestParameters *)requestParameters locationForError:(nonnull NSString *)locationForError requestFinished:(nullable void (^)(id _Nullable jsonObject, MVMCoreErrorObject * _Nullable error))requestFinished; - (void)sendRequest:(nonnull MVMCoreRequestParameters *)requestParameters locationForError:(nonnull NSString *)locationForError requestFinished:(nullable void (^)(id _Nullable jsonObject, MVMCoreErrorObject * _Nullable error))requestFinished;

View File

@ -132,7 +132,7 @@
#pragma mark - Request Functions. #pragma mark - Request Functions.
- (void)transformToRequestWithParameters:(nonnull MVMCoreRequestParameters *)requestParameters closure:(nonnull void (^)(NSURLRequest * _Nullable request, MVMCoreErrorObject *_Nullable error))closure { - (void)transformToRequestWithParameters:(nonnull MVMCoreRequestParameters *)requestParameters completion:(nonnull void (^)(NSURLRequest * _Nullable request, MVMCoreErrorObject *_Nullable error))completion {
NSURL *url = [requestParameters resolveURL:[MVMCoreSessionObject sharedGlobal]]; NSURL *url = [requestParameters resolveURL:[MVMCoreSessionObject sharedGlobal]];
@ -152,14 +152,14 @@
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:timeOutInterval]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:timeOutInterval];
[self setHeadersForRequest:request requestParameters:requestParameters]; [self setHeadersForRequest:request requestParameters:requestParameters];
[self getJsonData:requestParameters forUrl:url closure:^(NSData * _Nullable jsonData, MVMCoreErrorObject * _Nullable error) { [self getJsonData:requestParameters forUrl:url completion:^(NSData * _Nullable jsonData, MVMCoreErrorObject * _Nullable error) {
/// Ensures that something in the body is always set. /// Ensures that something in the body is always set.
if (!jsonData) { if (!jsonData) {
closure(nil, error ?: [[MVMCoreErrorObject alloc] initWithTitle:nil message:nil code:ErrorCodeParsingJSON domain:ErrorDomainNative location:[NSString stringWithFormat:@"requestWithParameters_%@",requestParameters.pageType]]); completion(nil, error ?: [[MVMCoreErrorObject alloc] initWithTitle:nil message:nil code:ErrorCodeParsingJSON domain:ErrorDomainNative location:[NSString stringWithFormat:@"requestWithParameters_%@",requestParameters.pageType]]);
return; return;
} }
[request setHTTPBody:jsonData]; [request setHTTPBody:jsonData];
closure(request, nil); completion(request, nil);
}]; }];
} }
@ -191,9 +191,9 @@
} }
} }
- (void)getInitialParametersExcludingSections:(NSSet<NSString *> *_Nullable)excludeSections closure:(nonnull void (^)(NSDictionary *_Nullable parameters))closure {} - (void)getInitialParametersExcludingSections:(NSSet<NSString *> *_Nullable)excludeSections completion:(nonnull void (^)(NSDictionary *_Nullable parameters))closure {}
- (void)getJsonDictionary:(nonnull MVMCoreRequestParameters *)requestParameters closure:(nonnull void (^)(NSDictionary * _Nullable jsonDictionary))closure { - (void)getJsonDictionary:(nonnull MVMCoreRequestParameters *)requestParameters completion:(nonnull void (^)(NSDictionary * _Nullable jsonDictionary))completion {
NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
// Adds request specific parameters // Adds request specific parameters
@ -202,24 +202,24 @@
} }
if (!requestParameters.addInitialRequestParameters) { if (!requestParameters.addInitialRequestParameters) {
closure(parameters); completion(parameters);
return; return;
} }
// Sets up the Initial parameters. // Sets up the Initial parameters.
[self getInitialParametersExcludingSections:requestParameters.excludedInitialParameters closure:^(NSDictionary * _Nullable initialParameters) { [self getInitialParametersExcludingSections:requestParameters.excludedInitialParameters completion:^(NSDictionary * _Nullable initialParameters) {
if (initialParameters) { if (initialParameters) {
[parameters setObject:initialParameters forKey:@"InitialParams"]; [parameters setObject:initialParameters forKey:@"InitialParams"];
} }
closure(parameters); completion(parameters);
}]; }];
} }
- (void)getJsonData:(nonnull MVMCoreRequestParameters *)requestParameters forUrl:(nonnull NSURL *)url closure:(nonnull void (^)(NSData * _Nullable data, MVMCoreErrorObject * _Nullable error))closure { - (void)getJsonData:(nonnull MVMCoreRequestParameters *)requestParameters forUrl:(nonnull NSURL *)url completion:(nonnull void (^)(NSData * _Nullable data, MVMCoreErrorObject * _Nullable error))completion {
[self getJsonDictionary:requestParameters closure:^(NSDictionary * _Nullable parameters) { [self getJsonDictionary:requestParameters completion:^(NSDictionary * _Nullable parameters) {
// Ensure the parameters are valid json. // Ensure the parameters are valid json.
if (![NSJSONSerialization isValidJSONObject:parameters]) { if (![NSJSONSerialization isValidJSONObject:parameters]) {
closure(nil, [[MVMCoreErrorObject alloc] initWithTitle:nil message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorUnableToProcess] code:ErrorCodeParsingJSON domain:ErrorDomainNative location:[NSString stringWithFormat:@"requestWithParameters:pageType_%@:parameters_%@",requestParameters.pageType,parameters.description]]); completion(nil, [[MVMCoreErrorObject alloc] initWithTitle:nil message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorUnableToProcess] code:ErrorCodeParsingJSON domain:ErrorDomainNative location:[NSString stringWithFormat:@"requestWithParameters:pageType_%@:parameters_%@",requestParameters.pageType,parameters.description]]);
return; return;
} }
@ -229,7 +229,7 @@
// Pretty print for logging the request parameters. // Pretty print for logging the request parameters.
data = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:&jsonError]; data = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:&jsonError];
if (!data) { if (!data) {
closure(nil, [[MVMCoreErrorObject alloc] initWithTitle:nil message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorUnableToProcess] messageToLog:jsonError.localizedDescription code:jsonError.code domain:ErrorDomainSystem location:[NSString stringWithFormat:@"requestWithParameters:pageType_%@:parameters_%@",requestParameters.pageType,parameters.description]]); completion(nil, [[MVMCoreErrorObject alloc] initWithTitle:nil message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorUnableToProcess] messageToLog:jsonError.localizedDescription code:jsonError.code domain:ErrorDomainSystem location:[NSString stringWithFormat:@"requestWithParameters:pageType_%@:parameters_%@",requestParameters.pageType,parameters.description]]);
return; return;
} }
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
@ -239,7 +239,7 @@
// Standard condensed to send to the server. // Standard condensed to send to the server.
data = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:&jsonError]; data = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:&jsonError];
if (!data) { if (!data) {
closure(nil, [[MVMCoreErrorObject alloc] initWithTitle:nil message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorUnableToProcess] messageToLog:jsonError.localizedDescription code:jsonError.code domain:ErrorDomainSystem location:[NSString stringWithFormat:@"requestWithParameters:pageType_%@:parameters_%@",requestParameters.pageType,parameters.description]]); completion(nil, [[MVMCoreErrorObject alloc] initWithTitle:nil message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorUnableToProcess] messageToLog:jsonError.localizedDescription code:jsonError.code domain:ErrorDomainSystem location:[NSString stringWithFormat:@"requestWithParameters:pageType_%@:parameters_%@",requestParameters.pageType,parameters.description]]);
return; return;
} }
@ -247,7 +247,7 @@
if (requestParameters.imageData) { if (requestParameters.imageData) {
data = [self createMultipartFormBodyForRequestJsonData:data imageData:requestParameters.imageData]; data = [self createMultipartFormBodyForRequestJsonData:data imageData:requestParameters.imageData];
} }
closure(data, nil); completion(data, nil);
}]; }];
} }
@ -273,7 +273,7 @@
} }
- (void)sendRequest:(nonnull MVMCoreRequestParameters *)requestParameters locationForError:(nonnull NSString *)locationForError requestFinished:(nullable void (^)(id _Nullable jsonObject, MVMCoreErrorObject *_Nullable error))requestFinished { - (void)sendRequest:(nonnull MVMCoreRequestParameters *)requestParameters locationForError:(nonnull NSString *)locationForError requestFinished:(nullable void (^)(id _Nullable jsonObject, MVMCoreErrorObject *_Nullable error))requestFinished {
[self transformToRequestWithParameters:requestParameters closure:^(NSURLRequest * _Nullable request, MVMCoreErrorObject * _Nullable error) { [self transformToRequestWithParameters:requestParameters completion:^(NSURLRequest * _Nullable request, MVMCoreErrorObject * _Nullable error) {
if (error) { if (error) {
if (requestFinished) { if (requestFinished) {
requestFinished(nil, error); requestFinished(nil, error);

View File

@ -10,16 +10,13 @@ import Foundation
public extension MVMCoreLoadHandler { public extension MVMCoreLoadHandler {
func sendRequest(with parameters: MVMCoreRequestParameters, locationForError: String, requestFinished: @escaping (Any?, MVMCoreErrorObject?) -> Void) async -> URLSessionTask? { func sendRequest(with parameters: MVMCoreRequestParameters, locationForError: String, requestFinished: @escaping (Any?, MVMCoreErrorObject?) -> Void) async -> URLSessionTask? {
return await withCheckedContinuation { continuation in let result = await transformToRequest(with: parameters)
transformToRequest(with: parameters) { request, error in guard let request = result.0 else {
guard let request = request else { defer {
defer { requestFinished(nil, result.1)
requestFinished(nil, error)
}
return continuation.resume(returning: nil)
}
continuation.resume(returning: self.send(request, requestParameters: parameters, locationForError: locationForError, requestFinished: requestFinished))
} }
return nil
} }
return self.send(request, requestParameters: parameters, locationForError: locationForError, requestFinished: requestFinished)
} }
} }

View File

@ -28,7 +28,7 @@
@interface MVMCoreLoadRequestOperation () @interface MVMCoreLoadRequestOperation ()
@property (weak, nonatomic) NSURLSessionTask *sessionTask; @property (strong, nonatomic) NSURLSessionTask *sessionTask;
// For temporarily storing any alert to show until we determine it's delegate. // For temporarily storing any alert to show until we determine it's delegate.
@property (nonatomic, readwrite) BOOL alertToShow; @property (nonatomic, readwrite) BOOL alertToShow;
@ -304,7 +304,7 @@
} }
#endif #endif
[[MVMCoreLoadHandler sharedGlobal] transformToRequestWithParameters:requestParameters closure:^(NSURLRequest * _Nullable request, MVMCoreErrorObject * _Nullable error) { [[MVMCoreLoadHandler sharedGlobal] transformToRequestWithParameters:requestParameters completion:^(NSURLRequest * _Nullable request, MVMCoreErrorObject * _Nullable error) {
loadObject.operation.sessionTask = [[MVMCoreLoadHandler sharedGlobal] sendRequest:request requestParameters:requestParameters locationForError:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject] requestFinished:^(id jsonObject, MVMCoreErrorObject *error) { loadObject.operation.sessionTask = [[MVMCoreLoadHandler sharedGlobal] sendRequest:request requestParameters:requestParameters locationForError:[[MVMCoreLoadHandler sharedGlobal] errorLocationForRequest:loadObject] requestFinished:^(id jsonObject, MVMCoreErrorObject *error) {
if ([loadObject.operation checkAndHandleForCancellation]) { if ([loadObject.operation checkAndHandleForCancellation]) {

View File

@ -29,9 +29,6 @@
/// Creates the nsurlsession with default configuration and no delegate. Can subclass for different session. /// Creates the nsurlsession with default configuration and no delegate. Can subclass for different session.
- (nonnull NSURLSession *)createNSURLSession; - (nonnull NSURLSession *)createNSURLSession;
/// Gets inital parameters for request parameters.
- (nullable NSDictionary *)getInitialParameters;
/// Restarts the application session state. Can clear variables and pass a page type if needed. /// Restarts the application session state. Can clear variables and pass a page type if needed.
- (void)restartSessionWithPageType:(nullable NSString *)pageType requestUrl:(nullable NSURL *)requestUrl parameters:(nullable NSDictionary *)parameters clearAllVariables:(BOOL)clearAllVariables; - (void)restartSessionWithPageType:(nullable NSString *)pageType requestUrl:(nullable NSURL *)requestUrl parameters:(nullable NSDictionary *)parameters clearAllVariables:(BOOL)clearAllVariables;

View File

@ -64,15 +64,11 @@ public extension MVMCoreActionUtility {
@objc public extension MVMCoreActionUtility { @objc public extension MVMCoreActionUtility {
/// Can call to display a view controller based on the load object in the same way the architecture does it. Will check the presentation style of the page, action, and request. Will check if needs a view manager. /// Can call to display a view controller based on the load object in the same way the architecture does it. Will check the presentation style of the page, action, and request. Will check if needs a view manager.
@objc(displayViewController:forLoadObject:completionHandler:) @objc(displayViewController:forLoadObject:completionHandler:)
static func display(_ viewController: UIViewController & MVMCoreViewControllerProtocol, for loadObject: MVMCoreLoadObject?, completionHandler: (() -> Void)? = nil) { static func display(_ viewController: UIViewController & MVMCoreViewControllerProtocol, for loadObject: MVMCoreLoadObject?) async {
Task(priority: .high) { guard let navigationOperation = await NavigationHandler.shared().getNavigationOperation(with: viewController, loadObject: loadObject) else {
guard let navigationOperation = await NavigationHandler.shared().getNavigationOperation(with: viewController, loadObject: loadObject) else {
completionHandler?()
return return
} }
await NavigationHandler.shared().navigate(with: navigationOperation) await NavigationHandler.shared().navigate(with: navigationOperation)
completionHandler?()
}
} }
} }