Ios 为什么我的函数在使用DispatchQueue时不执行?
有人能解释一下为什么新视图在getMsg()完成执行之前进入吗?我尝试了许多不同的迭代,但似乎无法理解为什么它不起作用。onAppear()是否存在问题?还是我使用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
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
场景,但如果您真的这样做了,您将阻塞主队列并使整个应用程序死锁。您需要一个模型对象,该对象可以获取消息,然后发布新数据,从而刷新视图。