Я пытался сделать свой код чистым и отделить приведенный ниже код, я хочу удалить из него завершающий обработчик завершения и написать обработчик завершения в другом блоке кода.
func uploadMarcasMetodoNovo(_ id_resenha: Int) {
let resenhaDados:ResDadoModel = db.readDadosResenhaById(id_resenha)
let resenhaMarcas:[ResMarcasModel] = db.readResMarca(id_resenha)
// this for loop runs about for 7 times
for marca in resenhaMarcas {
contadorUploadMarcas = contadorUploadMarcas + 1
myUploadGroupMarcas.enter()
jsonRequestUploadImagemGrafica = ResMarcasModel.createJsonMarcaResenha(marca, resenhaDados.IdGedave )
let json: [String: Any] = jsonRequestUploadImagemGrafica
guard let jsonData = try? JSONSerialization.data(withJSONObject: json) else {
print("guard jsonData error")
return
}
let requestImagemGrafica = requestUploadFotos(jsonData)
let task = URLSession.shared.dataTask(with: requestImagemGrafica) { data, response, error in
if let error = error {
print("error: \(String(describing: error))")
return
}
print("data")
guard let returnData = String(data: data! encoding: .utf8) else {
print("returnData guard fail")
return
}
print("returnData")
print(returnData)
self.confirmStatusEnviada(marca)
self.myUploadGroupMarcas.leave()
print("end TASK")
}
task.resume()
}
myUploadGroupMarcas.notify(queue: DispatchQueue.main) {
print("myUploadGroupMarcas notify")
// more code ...
}
}
Это часть, которую я пишу, создавая отдельный обработчик завершения
let myCompletionHandler: (Data? URLResponse? Error?) -> Void = {
(data, response, error) in
if let error = error {
print("error: \(String(describing: error))")
return
}
print("data")
guard let returnData = String(data: data! encoding: .utf8) else {
print("returnData guard fail")
return
}
self.confirmStatusEnviada(marca)
self.myUploadGroupMarcas.leave()
}
но это не сработает, потому что в последних двух строках кода используются параметры, выходящие за рамки. Параметр "marca" и параметр "myUploadGroupMarcas" выходят за рамки. Есть ли способ использовать эти параметры внутри отдельной функции обработчика завершения?
Вы можете написать небольшой обработчик завершения, который вызывает ваш более длинный обработчик, передавая нужные вам переменные.
@user1922718 user1922718 Можете ли вы привести пример того, как будет работать этот другой обработчик завершения? Я новичок в использовании обработчиков завершения.
Поскольку обработчик завершения находится внутри цикла и также захватывает экземпляр
DispatchGroup
, попытки очистить код контрпродуктивны.