Почему не заходит в блок {data, response, error in?

Почему не заходит в блок {data, response, error in ... ?

 func GetParam(_ url: String) -> String {

   let url = URL(string: url)

   guard let downloadURL = url else {return "" }
   let session = URLSession.shared
   session.dataTask(with: downloadURL) { data, response, error in
       guard let data = data else {return}
          do{
            let responseVariant = try JSON(data: data)
               for item in responseVariant.arrayValue {
                 self.imageId = item["image"].stringValue
                }
          } catch{
            print(error)
          }
        }.resume()
    return imageId
}

После session.dataTask(with: downloadURL) { data, response, error in сразу переходит к resume.


Ответы (1 шт):

Автор решения: schmidt9

Не заходит потому что dataTask выполняется асинхронно, чтобы получить данные вам нужно изменить сигнатуру метода например на такую и дождаться ответа

func GetParam(_ url: String, completion: @escaping (_ imageId: String) -> Void)

И соответственно при получении данных data вернуть их путем вызова completion(imageId)

При этом не совсем понятно что вы делаете в цикле

for item in responseVariant.arrayValue {
    self.imageId = item["image"].stringValue
}

Очевидно в нем при переборе будет в конце-концов присвоено последнее значение в массиве, наверно нужно с чем-то сверяться и при выполнении условия выходить из цикла

→ Ссылка