从闭包内部循环中获取回调

Get callback from closures inside loop

提问人:Vikash Kumar Chaubey 提问时间:4/10/2023 最后编辑:Joakim DanielsonVikash Kumar Chaubey 更新时间:4/11/2023 访问量:48

问:

我正在使用一个递归函数,该函数调用子函数,这些函数在某些条件下返回调用此函数。这些函数使用闭包来返回数据,因为它们是某些处理(包括 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)
    }
}
iOS Swift Foreach 闭包

评论


答: 暂无答案