Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么我的函数在使用DispatchQueue时不执行?_Ios_Swift_Firebase_Asynchronous_Swiftui - Fatal编程技术网

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

Ios 为什么我的函数在使用DispatchQueue时不执行?,ios,swift,firebase,asynchronous,swiftui,Ios,Swift,Firebase,Asynchronous,Swiftui,有人能解释一下为什么新视图在getMsg()完成执行之前进入吗?我尝试了许多不同的迭代,但似乎无法理解为什么它不起作用。onAppear()是否存在问题?还是我使用DispatchQueue的方式 struct ChatView : View { @State var msgs = [Msg]() @EnvironmentObject var msg : msgDatas let group = DispatchGroup() var body : some

有人能解释一下为什么新视图在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
}

这不是DispatchGroup()解决的问题吗?不,当调度组为空时,您可以使用调度组执行一些代码(通过
通知
),或者您可以
等待
,直到调度组为空。您正在考虑
.wait
场景,但如果您真的这样做了,您将阻塞主队列并使整个应用程序死锁。您需要一个模型对象,该对象可以获取消息,然后发布新数据,从而刷新视图。