背景:
我正在使用一个名为KolodaView的库,它为Swift应用程序生成Tinder卡。这些卡是在我的视图控制器分配委托后的viewDidLoad()函数中呈现的。我编写了viewForCardAt()委托函数,以便对呈现的每一张卡进行getPics()调用,该调用设置包含UIImageView的全局变量imageResult: UIImageView (注:从viewForCardAt()返回的UIView是将放在卡上的实际UIView )。
问题:
getPics()调用fire base (storageRef.getData()),结果是异步的。因为viewForCardAt() 必须返回一些东西(在生成卡片的过程中)并在主线程上运行,所以当getPics()函数完成时,它不能等待或收到“通知”。由于getPics()在viewForCardAt()返回其UIView之前还没有完成获取数据,所以无法等待呈现的卡片没有图像的结果。
我尝试过的:
使用调度组等待,但是由于这两个调用都发生在主线程上,所以在Koloda viewForCardAt()函数甚至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'
}
}发布于 2020-05-28 04:54:46
使用完成处理程序而不是返回
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'
}https://stackoverflow.com/questions/62055892
复制相似问题