merge
This commit is contained in:
parent
2ee96bf6d9
commit
301e166971
@ -10,10 +10,15 @@ import Foundation
|
|||||||
|
|
||||||
public protocol ClientParameterModelProtocol: ModelProtocol {
|
public protocol ClientParameterModelProtocol: ModelProtocol {
|
||||||
var type: String { get }
|
var type: String { get }
|
||||||
|
var isFlatMap: Bool? { get }
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension ClientParameterModelProtocol {
|
public extension ClientParameterModelProtocol {
|
||||||
|
|
||||||
|
var isFlatMap: Bool? {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
var type: String {
|
var type: String {
|
||||||
get { Self.identifier }
|
get { Self.identifier }
|
||||||
}
|
}
|
||||||
|
|||||||
@ -54,7 +54,6 @@ import Foundation
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var parametersList: [String: AnyHashable] = [:]
|
|
||||||
let timeout = clientParameterModel.timeout ?? 30.0
|
let timeout = clientParameterModel.timeout ?? 30.0
|
||||||
|
|
||||||
let parametersWorkQueue = DispatchQueue(label: "com.mva.clientparameter")
|
let parametersWorkQueue = DispatchQueue(label: "com.mva.clientparameter")
|
||||||
@ -64,16 +63,26 @@ import Foundation
|
|||||||
// Dispatch setup on queue to ensure setup is complete before completion callbacks.
|
// Dispatch setup on queue to ensure setup is complete before completion callbacks.
|
||||||
parametersWorkQueue.async(group: group, qos: .userInitiated) { [weak self] in
|
parametersWorkQueue.async(group: group, qos: .userInitiated) { [weak self] in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
|
|
||||||
|
var returnedList: [[String: AnyHashable]] = []
|
||||||
|
var mergedParametersList: [String: AnyHashable] {
|
||||||
|
var parametersList: [String: AnyHashable] = [:]
|
||||||
|
for item in returnedList {
|
||||||
|
parametersList = parametersList.merging(item) { (_, new) in new }
|
||||||
|
}
|
||||||
|
return parametersList
|
||||||
|
}
|
||||||
|
|
||||||
// Setup completion handlers. Barriered to ensure one happens after the other.
|
// Setup completion handlers. Barriered to ensure one happens after the other.
|
||||||
var complete = false
|
var complete = false
|
||||||
let timeoutWorkItem = DispatchWorkItem(qos: .userInitiated) {
|
let timeoutWorkItem = DispatchWorkItem(qos: .userInitiated) {
|
||||||
completionHandler(parametersList);
|
completionHandler(mergedParametersList);
|
||||||
complete = true
|
complete = true
|
||||||
}
|
}
|
||||||
let completionWorkItem = DispatchWorkItem(qos: .userInitiated) {
|
let completionWorkItem = DispatchWorkItem(qos: .userInitiated) {
|
||||||
timeoutWorkItem.cancel()
|
timeoutWorkItem.cancel()
|
||||||
if !complete { // In the case of firing after timeout.
|
if !complete { // In the case of firing after timeout.
|
||||||
completionHandler(parametersList);
|
completionHandler(mergedParametersList);
|
||||||
complete = true
|
complete = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -84,17 +93,23 @@ import Foundation
|
|||||||
// Setup the parameter execution.
|
// Setup the parameter execution.
|
||||||
for parameterModel in clientParameterModel.list {
|
for parameterModel in clientParameterModel.list {
|
||||||
// Setup default timeout / nil error. This will be replaced as parameters are collected.
|
// Setup default timeout / nil error. This will be replaced as parameters are collected.
|
||||||
parametersList[parameterModel.type] = ["error": defaultErrorString]
|
if !(parameterModel.isFlatMap ?? false) {
|
||||||
|
returnedList.append([parameterModel.type: ["error": defaultErrorString]])
|
||||||
|
}
|
||||||
group.enter()
|
group.enter()
|
||||||
|
|
||||||
// Dispatch asynchronous injection.
|
// Dispatch asynchronous injection.
|
||||||
self.getParameterFromHandler(parameterModel,
|
self.getParameterFromHandler(parameterModel,
|
||||||
requestParameters: requestParameters,
|
requestParameters: requestParameters,
|
||||||
before: timeout) { (receivedParameter) in
|
before: timeout) { (receivedParameter) in
|
||||||
|
|
||||||
// Queue the results for merge.
|
// Queue the results for merge.
|
||||||
parametersWorkQueue.async {
|
parametersWorkQueue.async {
|
||||||
if let receivedParameter = receivedParameter as? [String: AnyHashable] {
|
if parameterModel.isFlatMap ?? false, let receivedParameter = receivedParameter as? [String: AnyHashable] {
|
||||||
//parametersList[parameterModel.type] = receivedParameter
|
// parametersList = parametersList.merging(receivedParameter) { (_, new) in new }
|
||||||
parametersList = parametersList.merging(receivedParameter) { (_, new) in new }
|
returnedList.append(receivedParameter)
|
||||||
|
} else if let receivedParameter = receivedParameter {
|
||||||
|
returnedList.append([parameterModel.type: receivedParameter])
|
||||||
}
|
}
|
||||||
group.leave() // Leaving is only done after setup (barriered).
|
group.leave() // Leaving is only done after setup (barriered).
|
||||||
}
|
}
|
||||||
@ -110,7 +125,10 @@ import Foundation
|
|||||||
guard let parameterHandler = createParametersHandler(parameterModel.type) else {
|
guard let parameterHandler = createParametersHandler(parameterModel.type) else {
|
||||||
return completionHandler(nil)
|
return completionHandler(nil)
|
||||||
}
|
}
|
||||||
parameterHandler.fetchClientParameters(for: parameterModel, requestParameters: requestParameters, timingOutIn: timeout, completionHandler: completionHandler)
|
parameterHandler.fetchClientParameters(for: parameterModel,
|
||||||
|
requestParameters: requestParameters,
|
||||||
|
timingOutIn: timeout,
|
||||||
|
completionHandler: completionHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add all registry here.
|
/// Add all registry here.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user