提问人:Vikash Kumar Chaubey 提问时间:4/10/2023 最后编辑:Joakim DanielsonVikash Kumar Chaubey 更新时间:4/11/2023 访问量:48
从闭包内部循环中获取回调
Get callback from closures inside loop
问:
我正在使用一个递归函数,该函数调用子函数,这些函数在某些条件下返回调用此函数。这些函数使用闭包来返回数据,因为它们是某些处理(包括 API 调用)所必需的。由于我使用闭包递归返回数据,因此我的函数将 rawData 作为参数。当我在 for 循环中调用此函数时,此原始数据将被覆盖。
由于 API 调用,我无法避免对函数使用闭包,因此,我需要一个解决方案,在该解决方案中,我可以在使用/不使用调度组的情况下实现类似的结构。
使用 dispatch Group -> 的上述结构示例
func recursive(rawDataMap: [String: [rawData]], completion: @escaping ([String: [ProcessedData]]) -> Void) {
var processedDataMap = [String: [ProcessedData]]()
let parentDispatchGroup = DispatchGroup()
// have not handled storing the key for the example structure but the key will be maintained in the actual code.
for (key,data) in rawDataMap {
parentDispatchGroup.enter()
if data.count > 1 {
let childDispatchGroup = DispatchGroup()
var processedDataArray = [processedData]()
for item in data {
childDispatchGroup.enter()
children(rawData: item){ processedData in
processedDataArray.append(processedData)
childDispatchGroup.leave()
}
}
childDispatchGroup.notify(queue: .main){
processedDataMap[key] = processedDataArray
parentDispatchGroup.leave()
}
}
}
parentDispatchGroup.notify(queue: .main) {
completion(processedDataMap)
}
}
func children(rawData: rawData, completion: @escaping (ProcessedData) -> Void) {
//condition to check if recursive call required or not
if rawData.nested {
recursive(rawDataMap: rawData.rawDataMap){ processedDataMap in
completion(ProcessedData(nested: true, processedDataMap: processedDataMap))
}
} else {
processing(rawData: rawData){ processedData in
completion(processedData)
}
}
}
func processing(rawData: rawData, completion: @escaping (ProcessedData) -> Void) {
//function to get API params from rawData
let params = getParamsFromData(rawData: rawData)
networkClient.API(params: Params){ processedData in
completion(processedData)
}
}
答: 暂无答案
评论