背景:
我正在使用一个名为KolodaView
的库,它为 Swift 应用程序生成 Tinder 式卡片。在分配委托后,卡片在视图控制器的viewDidLoad()
功能期间呈现。我编写了viewForCardAt()
delegate 函数,以便对于呈现的每个卡片,都会调用getPics()
,该调用设置一个包含UIImageView
的全局变量imageResult: UIImageView
(注意:从viewForCardAt()
返回的UIView
是将放置在卡上的实际UIView
(。
问题:
getPics()
调用火力基地(storageRef.getData()
(,结果是异步的。由于viewForCardAt()
必须返回一些内容(在生成卡的过程中(并在主线程上运行,因此当getPics()
函数完成时,它不能等待或"通知"。无法等待会导致渲染的卡片没有图像,因为getPics()
在viewForCardAt()
返回其UIView
之前尚未完成数据获取。
我尝试过的:
使用调度组等待,但由于这两个调用都发生在主线程上,因此在 KolodaviewForCardAt()
函数甚至getPics()
函数中添加等待语句会冻结整个应用程序。我想过以某种方式将getPics
放入不同的异步线程中,但随后viewForCardAt()
仍然需要等待完成getPics()
因为它无法返回,直到getPics()
"返回其值"(将其值分配给全局引用(。
相关代码(抽象(
myViewController() {
var imageResult: UIImageView
override func viewDidLoad() {
self.kolodaView.delegate = self
}
.
.
.
func getPics() {
grabImageDispatchGroup.enter()
let storage = Storage.storage
let storageRef = storage.reference(forURL: photoLink)
//the asynch firebase call
storageRef.getData(....) { (data, error) in
//the actual result of the query being stored
//for the Koloda card to use on the current card
self.imageResult.image = UIImage(data: data)
grabImageDispatchGroup.leave()
}
}
//run for element in a specified 'user' array ("dataSource" stuff not shown for brevity)
func Koloda(_ koloda: KolodaView, viewForCardAt index: Int) -> UIView {
var cardView = UIView()
getPics()
grabImageDispatchGroup.notify() { //this cannot work since we must return a value
cardView.addSubview(imageResult)
return cardView
}
//invalid: 'this function must return something'
}
}
使用完成处理程序而不是返回
func Koloda(_ koloda: KolodaView, viewForCardAt index: Int , completion:@escaping (UIView) -> Void ) {
var cardView = UIView()
getPics()
grabImageDispatchGroup.notify() { //this cannot work since we must return a value
cardView.addSubview(imageResult)
return completion( cardView)
}
//invalid: 'this function must return something'
}