作者:陌北从南_221 | 来源:互联网 | 2023-05-17 12:39
ForsomereasonwhenIrunthefollowingmethod,thefirstqueryrunsafterthemethodcompletes.I
For some reason when I run the following method, the first query runs after the method completes. I tried using a dispatch block in order to force the query to run first, but the query never runs at all then and the app simply freezes. Let me know if you know what is wrong.
出于某种原因,当我运行以下方法时,第一个查询在方法完成后运行。我尝试使用调度块以强制查询首先运行,但查询永远不会运行然后应用程序只是冻结。如果你知道什么是错的,请告诉我。
Method without dispatch group:
没有派遣组的方法:
func loadConversations() {
let ref = FIRDatabase.database().reference()
let cOnvoRef= ref.child("users").child(FIRAuth.auth()!.currentUser!.uid).child("conversations")
var cOnversationID= [String]()
print(1)
convoRef.queryOrderedByKey().observeSingleEvent(of: .value, with: { (snapshot) in
let enumerator = snapshot.children
print(2)
while let rest = enumerator.nextObject() as? FIRDataSnapshot {
print(3)
if let id = rest.value as? String{
conversationID.append(id)
print(id)
}
}
})
print(4)
print("size: \(conversationID.count)")
for id in conversationID {
print(5)
ref.child("conversations").queryEqual(toValue: id).observeSingleEvent(of: .value, with: { (snapshot) in
print(6)
if let cOnvo= snapshot.value as? [String : AnyObject] {
print(7)
let cOnversation= Conversation()
conversation.cOnversationID= id
conversation.name = "Temporary test name"
self.Conversations.append(conversation)
}
})
ref.removeAllObservers()
}
print(8)
self.conversationTableView.reloadData()
ref.removeAllObservers()
}
This prints:
这打印:
1
4
size: 0
8
2
3
-KZyMMzXmkQC_OF0T08_
With the dispatch group:
使用调度组:
func loadConversations() {
let dispatchGroup = DispatchGroup()
let ref = FIRDatabase.database().reference()
let cOnvoRef= ref.child("users").child(FIRAuth.auth()!.currentUser!.uid).child("conversations")
var cOnversationID= [String]()
print(1)
dispatchGroup.enter()
convoRef.queryOrderedByKey().observeSingleEvent(of: .value, with: { (snapshot) in
let enumerator = snapshot.children
print(2)
while let rest = enumerator.nextObject() as? FIRDataSnapshot {
print(3)
if let id = rest.value as? String{
conversationID.append(id)
print(id)
dispatchGroup.leave()
}
}
})
print(4)
dispatchGroup.wait()
print("size: \(conversationID.count)")
for id in conversationID {
print(5)
ref.child("conversations").queryEqual(toValue: id).observeSingleEvent(of: .value, with: { (snapshot) in
print(6)
if let cOnvo= snapshot.value as? [String : AnyObject] {
print(7)
let cOnversation= Conversation()
conversation.cOnversationID= id
conversation.name = "Temporary test name"
self.Conversations.append(conversation)
}
})
}
print(8)
self.conversationTableView.reloadData()
ref.removeAllObservers()
}
This prints
这打印
1
4
but then it just freezes and waits. The query never runs.
但它只是冻结和等待。查询永远不会运行。
I am not sure why the query just does not appear to be entered. When the query is entered, it works perfectly fine, but it is entered too late. Any help is greatly appreciated. Thanks!
我不确定为什么查询似乎没有输入。输入查询后,它完全正常,但输入太晚了。任何帮助是极大的赞赏。谢谢!
1 个解决方案