如何在主线程中等待异步火力调用(swift)



背景:

我正在使用一个名为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'
}

相关内容

  • 没有找到相关文章

最新更新