Return 在完成区块 Swift
Return in Completion Block Swift
我正在实施 KolodaView,网址为:https://github.com/Yalantis/Koloda。 viewForCardAt
函数 return 是 UIView
,我的 UIView
将有一个图像需要下载。问题是函数本身需要 return 类型的 UIView
但我无法知道 setupCard
方法的完成块何时执行完毕,因此我可能会结束 returning 一个空的 FlatCard
而不是在完成块中获得的 FlatCard
。我尝试将 return a
添加到完成块,但这是不允许的。我如何更改下面的代码以保证在执行完成块后仅 returned 卡片。
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
}
}
你不能 return 东西还没准备好。
就我个人而言,我会更新 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
}
我正在实施 KolodaView,网址为:https://github.com/Yalantis/Koloda。 viewForCardAt
函数 return 是 UIView
,我的 UIView
将有一个图像需要下载。问题是函数本身需要 return 类型的 UIView
但我无法知道 setupCard
方法的完成块何时执行完毕,因此我可能会结束 returning 一个空的 FlatCard
而不是在完成块中获得的 FlatCard
。我尝试将 return a
添加到完成块,但这是不允许的。我如何更改下面的代码以保证在执行完成块后仅 returned 卡片。
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
}
}
你不能 return 东西还没准备好。
就我个人而言,我会更新 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
}