#swift #xcode
Вопрос:
У меня есть следующий код, который работает примерно :
for resFoto in resFotosResenhaEscolhidas {
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: {isOk,msgError,httpCode,needLogin,response in
self.checkResponseUploadImagemFotoResenha(response as AnyObject, httpCode)
})
}
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 // received from a network request, for example
let jsonResponse = try? JSONSerialization.jsonObject(with: data, options: [])
print("json response upload foto")
print(jsonResponse!)
}
}
В ServiceRepository.post просто запустите «URLSession.dataTask», но я хочу знать, как я могу контролировать завершение запроса.
Объект «resFotosResenhaEscolhidas» содержит внутри себя массив от 0 до 4 в зависимости от вызова. Итак, код запускается и создает от 0 до 4 запросов.
Если 4 запроса запущены, я просто хочу знать, как я могу проверить, когда они будут завершены?
Ответ №1:
Посмотрите на использование a DispatchGroup
. Вы создадите a DispatchGroup
, когда будете готовы начать совершать сетевые звонки.
Вы бы вызывали enter()
свою группу отправки каждый раз, когда начинаете новую URLSession
задачу (или другую асинхронную задачу). вы бы вызывали leave()
группу отправки в обработчике завершения для каждой задачи.
После того как вы отправите свои асинхронные задачи, вы вызовете notify()
метод группы отправки, чтобы отправить блок, который будет выполняться после завершения всех ваших асинхронных задач. (Важно, чтобы вы подождали, пока не отправите свои асинхронные задачи, прежде чем звонить notify()
. Если вы попытаетесь вызвать его перед отправкой своих задач, он немедленно вызовет его закрытие, так как никакие задачи не выполняются.)
Я написал небольшой демонстрационный проект, в котором используется диспетчерская группа для мониторинга набора асинхронных задач. (В демо-версии задачи просто задерживаются на случайное время перед завершением и генерируют случайное число.)
Он ждет, пока все они не будут завершены, а затем указывает задачу, которая вернула наибольшее значение.
Вы можете проверить это на Github: DispatchGroupDemo на github