首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何等待主线程中的同步Firebase调用(Swift)

如何等待主线程中的同步Firebase调用(Swift)
EN

Stack Overflow用户
提问于 2020-05-28 02:17:15
回答 1查看 176关注 0票数 1

背景:

我正在使用一个名为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()‘返回其值’(将其值分配给全局引用)。

相关代码(摘要)

代码语言:javascript
复制
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'
    }

}
EN

回答 1

Stack Overflow用户

发布于 2020-05-28 04:54:46

使用完成处理程序而不是返回

代码语言:javascript
复制
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'
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62055892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档