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
相关产品推荐
相关产品推荐

