You need to enable JavaScript to run this app. Swift中如何管控不同数量异步网络请求的全部完成时机
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何管控不同数量异步网络请求的全部完成时机

实现方案

你可以通过系统自带的DispatchGroup实现多个异步上传请求的完成状态监听,不需要引入第三方依赖,适配0~4个请求的所有场景,逻辑如下:

  • 每发起一个上传请求前调用DispatchGroup.enter(),标记新增一个待完成的异步任务
  • 每个上传请求的回调执行完成后(无论成功失败)调用DispatchGroup.leave(),标记该任务已结束
  • 通过DispatchGroup.notify()监听所有任务完成的事件,触发你需要的后续逻辑
    注意:enter()和leave()必须严格配对,否则会出现回调永远不触发或者异常崩溃的问题

改造后的完整代码示例

// 初始化DispatchGroup实例
let uploadGroup = DispatchGroup()

for resFoto in resFotosResenhaEscolhidas {
    // 发起请求前先进入组
    uploadGroup.enter()
    
    jsonRequestUploadImagem = ResFotosModel.createJsonFotoResenha(resFoto)
    
    let requestUploadImagem: NSMutableURLRequest = serviceRepository.clientURLRequest(wsUploadImagem, typeAutho: .basic, parms: "", body: jsonRequestUploadImagem as Dictionary<String, AnyObject>)
    
    serviceRepository.post(requestUploadImagem, retryLogin: true, completion: { [weak self] isOk,msgError,httpCode,needLogin,response in
        guard let self = self else {
            // 页面已释放时也必须调用leave,避免组永远无法关闭
            uploadGroup.leave()
            return
        }
        self.checkResponseUploadImagemFotoResenha(response as AnyObject, httpCode)
        // 业务逻辑执行完后调用leave,标记当前请求任务结束
        uploadGroup.leave()
    })
}

// 所有上传请求完成后的回调,默认在主队列执行,也可以指定其他队列
uploadGroup.notify(queue: .main) {
    print("所有上传请求已全部执行完成")
    // 这里写你需要执行的后续逻辑
}

func checkResponseUploadImagemFotoResenha(_ response:AnyObject, _ httpCode:Int) {
    
    if httpCode != 200 {
        let string = String(data: response as! Data, encoding: .utf8)
        print( string!+" \n Erro HTTP: "+String(httpCode) )
        
    } else {
       // httpCode == 200
       let data: Data = response as! Data
       let jsonResponse = try? JSONSerialization.jsonObject(with: data, options: [])

       print("json response upload foto")
       print(jsonResponse!)
    }
}

边界场景适配

如果resFotosResenhaEscolhidas数组为空,没有发起任何上传请求,notify回调也会正常触发,不需要额外做判空处理。


内容的提问来源于stack exchange,提问作者fabiobh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 05:39:02