在完成块 Swift 中返回
Posted
技术标签:
【中文标题】在完成块 Swift 中返回【英文标题】:Return in Completion Block Swift 【发布时间】:2017-12-21 13:37:12 【问题描述】:我正在实施 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
【问题讨论】:
FlatCard
是什么?
【参考方案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
【讨论】:
以上是关于在完成块 Swift 中返回的主要内容,如果未能解决你的问题,请参考以下文章