只有在 SwiftUI 和 Firebase 中完成循环中的异步调用时,如何才能返回函数?

Posted

技术标签:

【中文标题】只有在 SwiftUI 和 Firebase 中完成循环中的异步调用时,如何才能返回函数?【英文标题】:How can I return a function only when the async call in a loop is completed in SwiftUI and Firebase? 【发布时间】:2020-07-25 09:33:04 【问题描述】:

我想要一个函数,当用户作为参数传入时,它会返回用户所做的评论列表。但是,我意识到该函数返回一个空数组,因为对数据库的调用仅在函数返回后运行。

我在网上做了一些搜索并尝试使用 DispatchGroup,但不确定我是否正确应用它。

不确定我是否足够清楚,但这是我的代码的 sn-p:

func getAllReviews(user: User) 
        let reviewID = user.reviews
        var reviews: [Review] = [Review]()
        let group = DispatchGroup()
        group.enter()
        for i in reviewID 
            print(i)
            db.collection("reviews").document(i).getDocument 
                (query, err) in
                print("alive??")
                DispatchQueue.main.async 
                    if err != nil 
                        print("hello")
                     else 
                        print("did it reach")
                 
                        let userId = query!.get("user id") as? String ?? ""
                       
                        let star = query!.get("star") as? Int ?? -1
                        let value = query!.get("value") as? Int ?? 0
                        let comments = query!.get("comments") as? String ?? ""
                        print(comments)
                        reviews.append(Review(id: i,userId: userId,  star: star, value: value, comments: comments))
                        print(reviews)
                        print("does it come")
                    
                
                group.leave()
            
        
        group.notify(queue: .main) 
            completion(reviews)
        
    

不胜感激,提前谢谢你!

【问题讨论】:

【参考方案1】:

enter 行在错误的位置,它必须在循环内。

并且不需要DispatchQueue.main 闭包

func getAllReviews(user: User) 
    let reviewID = user.reviews
    var reviews: [Review] = [Review]()
    let group = DispatchGroup()
    
    for i in reviewID 
        print(i)
        group.enter()
        db.collection("reviews").document(i).getDocument 
            (query, err) in
            print("alive??")
            
            if err != nil 
                print("hello")
             else 
                print("did it reach")
             
                let userId = query!.get("user id") as? String ?? ""
                   
                let star = query!.get("star") as? Int ?? -1
                let value = query!.get("value") as? Int ?? 0
                let comments = query!.get("comments") as? String ?? ""
                print(comments)
                reviews.append(Review(id: i,userId: userId,  star: star, value: value, comments: comments))
                print(reviews)
                print("does it come")
            
            group.leave()
        
    
    group.notify(queue: .main) 
        completion(reviews)
    

【讨论】:

以上是关于只有在 SwiftUI 和 Firebase 中完成循环中的异步调用时,如何才能返回函数?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 身份验证 swiftui

SwiftUI 和 Firebase:如何删除用户?

SwiftUI 和 Firebase:当前用户是不是持续存在?

Firebase SwiftUI 和 Firebase Auth - 不读取用户 ID?

使用 Firebase 的 Swiftui 中未显示数据

SwiftUI / Firebase:我可以使用@Published 向 Firebase 数据库发送和接收单个值吗?