passing completion handler and timout

This commit is contained in:
Suresh, Kamlesh 2021-01-07 14:51:54 -05:00
parent d65351cabb
commit 9538b50f84
2 changed files with 23 additions and 17 deletions

View File

@ -11,10 +11,11 @@ import Foundation
public protocol ClientParameterProtocol { public protocol ClientParameterProtocol {
init() init()
static var name: String { get } static var name: String { get }
func clientParameter(with paramModel: ClientParameterModelProtocol?) -> [String: Any]? func clientParameter(with paramModel: ClientParameterModelProtocol, _ timout: CGFloat?, completionHandler:@escaping ([String: Any]?) -> ())
} }
extension ClientParameterProtocol { extension ClientParameterProtocol {
/// Handle encoding and errors /// Handle encoding and errors
public func getJSON(with paramModel: ClientParameterModelProtocol?) -> JSONDictionary? { public func getJSON(with paramModel: ClientParameterModelProtocol?) -> JSONDictionary? {
guard let dataModel = paramModel, guard let dataModel = paramModel,

View File

@ -37,35 +37,40 @@ import Foundation
DispatchQueue.global(qos: .userInitiated).async { DispatchQueue.global(qos: .userInitiated).async {
let timeout = clientParameters.optionalCGFloatForKey("timeout") ?? 60.0
let concurrentQueue = DispatchQueue(label: "com.mva.clientparam", attributes: .concurrent) let concurrentQueue = DispatchQueue(label: "com.mva.clientparam", attributes: .concurrent)
let group = DispatchGroup() let group = DispatchGroup()
for param in paramsModelList { for param in paramsModelList {
group.enter() group.enter()
concurrentQueue.async(flags: .barrier) {
if let clientParam = clientParameterRegistry.injectParam(param) { clientParameterRegistry.injectParam(param, timeout-1) { (clientParam) in
paramsList.merge(clientParam) { (_, new) in new } guard let clientParam = clientParam else {
group.leave()
return
}
concurrentQueue.async(flags: .barrier) {
paramsList.merge(clientParam) { (_, new) in new }
group.leave()
} }
group.leave()
} }
} }
if let timeout = clientParameters.optionalCGFloatForKey("timeout") { let dispatchAfterTime = DispatchTimeInterval.seconds(Int(timeout))
let dispatchAfterTime = DispatchTimeInterval.seconds(Int(timeout)) _ = group.wait(timeout: .now() + dispatchAfterTime)
_ = group.wait(timeout: .now() + dispatchAfterTime)
} else {
group.wait()
}
completionHandler(paramsList) completionHandler(paramsList)
} }
} }
func injectParam( _ param: [String: Any]) -> [String: Any]? { func injectParam( _ param: [String: Any], _ timout: CGFloat, completionHandler:@escaping ([String: Any]?) -> ()) {
if let paramModel = try? ClientParameterRegistry.getModel(param),
let param = ClientParameterRegistry.shared.createParam(paramModel.type) { guard let paramModel = try? ClientParameterRegistry.getModel(param),
return param.clientParameter(with: paramModel) let param = ClientParameterRegistry.shared.createParam(paramModel.type) else {
return completionHandler(nil)
} }
return nil
param.clientParameter(with: paramModel, timout, completionHandler: completionHandler)
} }