为什么在使用DispatchQueue时我的函数无法执行?

丹尼尔·扎夫曼

有人可以向我解释为什么在getMsg()完成执行之前进入新视图吗?我尝试了许多不同的迭代,但似乎无法弄清为什么它不起作用。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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的CUDA函数的HOST版本无法执行?

来自分类Dev

为什么我的cronjob无法执行我的shell脚本?

来自分类Dev

为什么我的docker-entrypoint.sh无法执行?

来自分类Dev

为什么我的Swift for-in-loop无法执行/迭代?

来自分类Dev

为什么我的System.out.println无法执行?

来自分类Dev

为什么我的名为“ set”的程序无法执行?

来自分类Dev

为什么我的firefox插件无法执行Request

来自分类Dev

为什么我的Shell脚本无法执行?

来自分类Dev

为什么我的脚本无法执行?

来自分类Dev

为什么即使成功创建了线程并且没有编译错误,我的卖方函数也无法执行?

来自分类Dev

为什么断点条件无法执行?

来自分类Dev

为什么验证功能无法执行

来自分类Dev

为什么for循环无法执行?

来自分类Dev

为什么插件无法执行

来自分类Dev

为什么如果条件无法执行?

来自分类Dev

为什么我的php代码在ajax执行时无法执行

来自分类常见问题

为什么输入后我的二进制搜索脚本无法执行?

来自分类Dev

为什么在我的Cubit LoadedState中的Dart中代码无法执行并被跳过?

来自分类Dev

为什么输入后我的二进制搜索脚本无法执行?

来自分类Dev

为什么此点击事件处理程序无法执行我的代码?

来自分类Dev

为什么在我的Cubit LoadedState中的Dart中代码无法执行并被跳过?

来自分类Dev

为什么我无法执行获取java.lang.IllegalStateException的活动方法?

来自分类Dev

我的Google Guice方法拦截器无法执行,但是为什么呢?

来自分类Dev

为什么我的第二个while循环无法执行?

来自分类Dev

当我将jar文件复制到Android Studio中的lib文件夹时,为什么总是说“无法执行重构”?

来自分类Dev

当我将jar文件复制到Android Studio中的lib文件夹时,为什么总是说“无法执行重构”?

来自分类Dev

当值大于时,为什么不执行我的jQuery函数?

来自分类Dev

为什么我在执行 Postgres 函数时收到这个错误

来自分类Dev

当我在函数中使用if语句时,为什么我的javascript无法正常工作

Related 相关文章

  1. 1

    为什么我的CUDA函数的HOST版本无法执行?

  2. 2

    为什么我的cronjob无法执行我的shell脚本?

  3. 3

    为什么我的docker-entrypoint.sh无法执行?

  4. 4

    为什么我的Swift for-in-loop无法执行/迭代?

  5. 5

    为什么我的System.out.println无法执行?

  6. 6

    为什么我的名为“ set”的程序无法执行?

  7. 7

    为什么我的firefox插件无法执行Request

  8. 8

    为什么我的Shell脚本无法执行?

  9. 9

    为什么我的脚本无法执行?

  10. 10

    为什么即使成功创建了线程并且没有编译错误,我的卖方函数也无法执行?

  11. 11

    为什么断点条件无法执行?

  12. 12

    为什么验证功能无法执行

  13. 13

    为什么for循环无法执行?

  14. 14

    为什么插件无法执行

  15. 15

    为什么如果条件无法执行?

  16. 16

    为什么我的php代码在ajax执行时无法执行

  17. 17

    为什么输入后我的二进制搜索脚本无法执行?

  18. 18

    为什么在我的Cubit LoadedState中的Dart中代码无法执行并被跳过?

  19. 19

    为什么输入后我的二进制搜索脚本无法执行?

  20. 20

    为什么此点击事件处理程序无法执行我的代码?

  21. 21

    为什么在我的Cubit LoadedState中的Dart中代码无法执行并被跳过?

  22. 22

    为什么我无法执行获取java.lang.IllegalStateException的活动方法?

  23. 23

    我的Google Guice方法拦截器无法执行,但是为什么呢?

  24. 24

    为什么我的第二个while循环无法执行?

  25. 25

    当我将jar文件复制到Android Studio中的lib文件夹时,为什么总是说“无法执行重构”?

  26. 26

    当我将jar文件复制到Android Studio中的lib文件夹时,为什么总是说“无法执行重构”?

  27. 27

    当值大于时,为什么不执行我的jQuery函数?

  28. 28

    为什么我在执行 Postgres 函数时收到这个错误

  29. 29

    当我在函数中使用if语句时,为什么我的javascript无法正常工作

热门标签

归档