Конечно, это так, потому что конец функции не является end с точки зрения временной шкалы.Строка print
в конце метода выполняется непосредственно перед добавлением любого результата задачи с данными в очередь.
Вам необходимо DispatchGroup
, закрытие notify
выполняется после всех задачзавершены.
class func getImages(photos:[Photo]) {
var images:[UIImage] = [] // Why optional?
let group = DispatchGroup()
let arrayQueue = DispatchQueue(label: "imagesQueue", attributes: .concurrent)
for i in 0...20{
let url = EndPoints.getImage(farm: photos[i].farm, server: photos[i].server, id: photos[i].id, secret: photos[i].secret).url
group.enter()
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
arrayQueue.async(flags: .barrier) {
let image = UIImage(data: data!)!
images.append(image)
group.leave()
}
}
task.resume()
}
group.notify(queue: arrayQueue) {
print(images.count)
}
}
Имейте в виду, что ваш код надежно завершает работу при возникновении ошибки ...
И ваша пользовательская очередь фактически избыточна, и вы выполняете 2 1 задачи