diff --git a/MVMCore/MVMCore/ActionHandling/ActionHandler+ClientParameters.swift b/MVMCore/MVMCore/ActionHandling/ActionHandler+ClientParameters.swift index bbd951a..360546d 100644 --- a/MVMCore/MVMCore/ActionHandling/ActionHandler+ClientParameters.swift +++ b/MVMCore/MVMCore/ActionHandling/ActionHandler+ClientParameters.swift @@ -10,7 +10,7 @@ import Foundation public extension MVMCoreActionHandler { - @objc func setClientParameter(with actionMap: [String: Any]?, completionHandler: @escaping ([String : Any]?) -> ()) { + @objc func setClientParameter(with actionMap: [String: Any]?, completionHandler: @escaping ([String : Any]?) -> ()) throws { guard let clientParameters = actionMap?.optionalDictionaryForKey("clientParameters") else { completionHandler(actionMap) @@ -29,7 +29,7 @@ public extension MVMCoreActionHandler { } } - ClientParameterRegistry.injectParameters(with: clientParameters) { (clientParams) in + try ClientParameterRegistry.injectParameters(with: clientParameters) { (clientParams) in guard let clientParams = clientParams else { stopLoadingOverlay() completionHandler(actionMap) diff --git a/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.m b/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.m index 90374e5..837cadf 100644 --- a/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.m +++ b/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.m @@ -449,10 +449,18 @@ NSString * const KeyActionTypeOpen = @"openPage"; - (void)preprocessRequest:(nullable NSDictionary *)actionInformation actionBlock:(nullable void (^)(NSDictionary*))actionBlock { // Check for client params and fetch the parameters if ([actionInformation dict:@"clientParameters"]) { - [self setClientParameterWith:actionInformation - completionHandler:^(NSDictionary * _Nullable actionDict) { + + NSError *error = nil; + + [self setClientParameterWith:actionInformation error:&error completionHandler:^(NSDictionary * _Nullable actionDict) { actionBlock(actionDict); }]; + + if (error) { + //MVMCoreLoggingHandler.logDebugMessage(withDelegate: "JS function reult: \(String(describing: result))") + MVMCoreLog(@"Error clientParamters %@", error); + actionBlock(actionInformation); + } } else { actionBlock(actionInformation); } diff --git a/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterProtocol.swift b/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterProtocol.swift index a954ac4..e2a8129 100644 --- a/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterProtocol.swift +++ b/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterProtocol.swift @@ -13,17 +13,3 @@ public protocol ClientParameterProtocol { static var name: String { get } func fetchClientParameters(for paramModel: ClientParameterModelProtocol, timingOutIn timeout: Double, completionHandler:@escaping ([String: Any]?) -> ()) } - -extension ClientParameterProtocol { - - /// Handle encoding and errors - public func getJSON(with paramModel: ClientParameterModelProtocol?) -> JSONDictionary? { - guard let dataModel = paramModel, - let json = dataModel.toJSON() else { - // JSON parsing failed - MVMCoreLoggingHandler.logDebugMessage(withDelegate: "ClientParameterProtocol JSON parsing failed") - return nil - } - return json - } -} diff --git a/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterRegistry.swift b/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterRegistry.swift index fe91785..69ea2c4 100644 --- a/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterRegistry.swift +++ b/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterRegistry.swift @@ -9,9 +9,9 @@ import Foundation -@objcMembers open class ClientParameterRegistry: NSObject { +@objcMembers public class ClientParameterRegistry: NSObject { + - public static let shared = ClientParameterRegistry() private var mapping: [String: ClientParameterProtocol.Type] = [:] public func register(_ handler: T.Type) { @@ -23,22 +23,16 @@ import Foundation return parameterType.init() } - static func getClientParameterModel(_ clientParameters: [String: Any]) -> ClientParameterModel? { - do { - let data = try JSONSerialization.data(withJSONObject: clientParameters) - return try JSONDecoder().decode(ClientParameterModel.self, from: data) - } catch { - MVMCoreLoggingHandler.logDebugMessage(withDelegate: "Error parsing getClientParameterModel: \(error)") - return nil - } + static func getClientParameterModel(_ clientParameters: [String: Any]) throws -> ClientParameterModel? { + let data = try JSONSerialization.data(withJSONObject: clientParameters) + return try JSONDecoder().decode(ClientParameterModel.self, from: data) } - static func injectParameters(with clientParameters: [String: Any], - completionHandler:@escaping ([String: Any]?) -> ()) { + static func injectParameters(with clientParameters: [String: Any], completionHandler:@escaping ([String: Any]?) -> ()) throws { - let clientParameterRegistry = ClientParameterRegistry.shared + let clientParameterRegistry = MVMCoreObject.sharedInstance()?.clientParameterRegistry - guard let clientParameterModel = ClientParameterRegistry.getClientParameterModel(clientParameters) else { + guard let clientParameterModel = try ClientParameterRegistry.getClientParameterModel(clientParameters) else { completionHandler(nil) return } @@ -48,7 +42,7 @@ import Foundation let parametersWorkQueue = DispatchQueue(label: "com.mva.clientparameter") let group = DispatchGroup() - let defaultErrorString = "Failed to collect." + let defaultErrorString = "failed_to_collect." // Dispatch setup on queue to ensure setup is complete before completion callbacks. parametersWorkQueue.async(group: group, qos: .userInitiated) { @@ -75,25 +69,25 @@ import Foundation parametersList[parameterModel.type] = ["error": defaultErrorString] group.enter() // Dispatch asynchronous injection. - clientParameterRegistry.injectParameter(parameterModel, before: timeout) { (clientParam) in + clientParameterRegistry?.injectParameter(parameterModel, before: timeout) { (clientParam) in // Queue the results for merge. parametersWorkQueue.async { if let clientParam = clientParam { - parametersList[parameterModel.type] = clientParam + parametersList.merge(clientParam) { (_, new) in new } + //parametersList[parameterModel.type] = clientParam } group.leave() // Leaving is only done after setup (barriered). } } } - // Callback when all parameters have been merged. group.notify(queue: parametersWorkQueue, work: completionWorkItem); } } func injectParameter( _ parameterModel: ClientParameterModelProtocol, before timeout: Double, completionHandler:@escaping ([String: Any]?) -> ()) { - guard let parammeterHandler = ClientParameterRegistry.shared.createParametersHandler(parameterModel.type) else { + guard let parammeterHandler = createParametersHandler(parameterModel.type) else { return completionHandler(nil) } parammeterHandler.fetchClientParameters(for: parameterModel, timingOutIn: timeout, completionHandler: completionHandler) @@ -103,13 +97,8 @@ import Foundation public static func registerParameters() { } /// Register Default Core Bridge Objects - public static func register(handler: T.Type, for model: M.Type) { - - do { - try ModelRegistry.register(model) - } catch { - MVMCoreLoggingHandler.logDebugMessage(withDelegate: "Error registering: \(error)") - } - ClientParameterRegistry.shared.register(handler) + public static func register(handler: T.Type, for model: M.Type) throws { + try ModelRegistry.register(model) + MVMCoreObject.sharedInstance()?.clientParameterRegistry?.register(handler) } } diff --git a/MVMCore/MVMCore/Singletons/MVMCoreObject.h b/MVMCore/MVMCore/Singletons/MVMCoreObject.h index 03a8411..023ad63 100644 --- a/MVMCore/MVMCore/Singletons/MVMCoreObject.h +++ b/MVMCore/MVMCore/Singletons/MVMCoreObject.h @@ -18,6 +18,8 @@ #import #import +@class ClientParameterRegistry; + @interface MVMCoreObject : NSObject @property (nullable, strong, nonatomic) MVMCoreSessionObject *session; @@ -26,6 +28,7 @@ @property (nullable, strong, nonatomic) MVMCoreActionHandler *actionHandler; @property (nullable, strong, nonatomic) MVMCoreSessionTimeHandler *sessionHandler; @property (nullable, strong, nonatomic) MVMCoreLoadHandler *loadHandler; +@property (nullable, strong, nonatomic) ClientParameterRegistry *clientParameterRegistry; // The delegates @property (nullable, strong, nonatomic) id globalLoadDelegate; diff --git a/MVMCore/MVMCore/Singletons/MVMCoreObject.m b/MVMCore/MVMCore/Singletons/MVMCoreObject.m index 8ad4cb5..fbb0520 100644 --- a/MVMCore/MVMCore/Singletons/MVMCoreObject.m +++ b/MVMCore/MVMCore/Singletons/MVMCoreObject.m @@ -7,6 +7,7 @@ // #import "MVMCoreObject.h" +#import @implementation MVMCoreObject @@ -27,6 +28,7 @@ self.actionHandler = [[MVMCoreActionHandler alloc] init]; self.loggingDelegate = [[MVMCoreLoggingHandler alloc] init]; self.loadHandler = [[MVMCoreLoadHandler alloc] init]; + self.clientParameterRegistry = [ClientParameterRegistry new]; } @end