ios - 为什么我的函数在使用 DispatchQueue 时不执行?

标签 ios swift firebase asynchronous swiftui

有人可以向我解释为什么在 getMsg() 完成执行之前进入新 View 吗?我尝试了许多不同的迭代,但似乎无法弄清楚为什么它不起作用。 onAppear() 有问题吗?还是我使用 DispatchQueue 的方式?

struct ChatView : View {
    @State var msgs = [Msg]()
    @EnvironmentObject var msg : msgDatas
    let group = DispatchGroup()
       var body : some View{
           
           ZStack{
               Color("bg").edgesIgnoringSafeArea(.top)
               
               VStack(spacing: 0){
                   
                   chatTopview()
                   GeometryReader{_ in
                       
                    chatList(msgs: self.msg.msgs).onAppear(){
                        self.group.enter()
                        DispatchQueue.main.async {
                            
                            self.getMsgs()
                            self.group.leave()
                        }
                    }
                    }
                   }
                   
                   chatBottomView()
                   
           }
           .navigationBarTitle("")
               .navigationBarHidden(true)

    }
    
    func getMsgs() {
        let db = Firestore.firestore()
        let uid = UserDefaults.standard.value(forKey: "UserName") as! String
       
        
        db.collection("Private Messages").document(uid).collection("cZQM1Io2azboEUjt42nT6k6TEDF3").order(by: "date", descending: false).addSnapshotListener { (snap, err) in
            if err != nil {
                print(err!.localizedDescription)
            }
            /*
            if snap!.isEmpty {
                
            }
            */
            for i in snap!.documentChanges{
               
                if i.type == .added{
                    let id = i.document.documentID
                    let msg = i.document.get("msg") as! String
                    let user = i.document.get("user") as! String
                    self.msgs.append(Msg(id: id, msg: msg, user: user))
                  
                }
                
               
                     
                
            }
            
    }
    }
   }

最佳答案

你需要类似下面的东西

VStack(spacing: 0){

    chatTopview()
    GeometryReader{_ in

        if self.msg.msgs.isEmpty {
           Text("Loading...")        // << some placeholder
        } else {
            chatList(msgs: self.msg.msgs)
        }
    }
}
.onAppear(){                       // << at this level !!
    if self.msg.msgs.isEmpty {
        self.getMsgs()
    }
}
在回调中,这是异步的,可以在后台队列中发送,最好执行以下操作
var newMsgs = [Msg]()
for i in snap!.documentChanges{

    if i.type == .added{
        let id = i.document.documentID
        let msg = i.document.get("msg") as! String
        let user = i.document.get("user") as! String
        newMsgs.append(Msg(id: id, msg: msg, user: user))
    }
}
DispatchQueue.main.async {
    self.msgs = newMsgs
}

关于ios - 为什么我的函数在使用 DispatchQueue 时不执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63198735/

相关文章:

ios - 如何让搜索结果滚动到tableview的顶部?

swift - 这个 SwiftUI 动画应该只会淡出。为什么会向右移动?

arrays - Swift 中多维数组的语法是什么?

firebase - 我怎么知道 Firebase 云消息传递 token 已停用?

ios - 不执行任何 SQLite 查询

android - 如何在 corona sdk 中创建和保存设置?

ios - 增加 NSIndexPath

ios - 以编程方式更改现有的 UIBlurEffect UIBlurEffectStyle?

ios - 推送通知在前台不起作用

firebase - 禁用AccountChooser进行Firebase身份验证