Возврат в Завершение Блок Swift
Я реализую KolodaView, доступный по адресу: https://github.com/Yalantis/Koloda. viewForCardAt
функция возвращает UIView
, и мой UIView
будет изображение, которое нужно скачать. Проблема в том, что сама функция ожидает возвращаемый тип UIView
но у меня нет возможности узнать, когда блок завершения setupCard
метод завершен, поэтому я мог бы вернуть пустое FlatCard
вместо FlatCard
получено в блоке завершения. Я пытался добавить return a
до завершения блока, но это не разрешено. Как я могу изменить код ниже, чтобы гарантировать, что карта возвращается только после выполнения блока завершения.
func koloda(_ koloda: KolodaView, viewForCardAt index: Int) -> UIView {
var a = FlatCard()
if let listings = all_listings {
if index < listings.count {
setupCard(index: index, listings: listings, { (complete, card) in
if (complete) {
a = card
}
})
return a
}
}
return a
}
func setupCard(index: Int, listings : [Listing], _ completionHandler: @escaping (_ complete: Bool, _ card : FlatCard) -> ()) -> (){
let curr_card = FlatCard()
if let main_photo_url = listings[index].pic1url {
URLSession.shared.dataTask(with: main_photo_url, completionHandler: { (data, response, error) in
if (error != nil) {
print(error)
return
}
DispatchQueue.main.async {
curr_card.mainFlatImage = UIImage(data: data!)
}
})
completionHandler(true,curr_card)
return
} else {
completionHandler(true,curr_card)
return
}
}
1 ответ
Вы не можете вернуть что-то, пока оно не будет готово.
Лично я бы обновил FlatCard, чтобы он мог загружать само изображение и обновлять свой собственный вид, когда это будет сделано.
Нечто подобное
class FlatView: UIView {
var imageURL: URL? {
didSet {
if let imageURL = newValue {
// download image, if success set the image on the imageView
}
}
}
}
Тогда все, что вам нужно сделать в другой функции, это...
func koloda(_ koloda: KolodaView, viewForCardAt index: Int) -> UIView {
var a = FlatCard()
if let listings = all_listings {
if index < listings.count {
a.imageURL = listings[index].pic1url
}
}
return a
}