我正在开发一个使用firebase数据库的项目,此时我正在尝试使用这段代码从我的基础读取异步数据:
let myGroup = DispatchGroup()
let ref1 = FIRDatabase.database().reference().child("chats")
let curUserUid = (FIRAuth.auth()?.currentUser?.uid)!
myGroup.enter()
ref1.observe(FIRDataEventType.value, with: { (snapshot) in
if snapshot.hasChildren() {
let postDict = snapshot.value as? [String : AnyObject] ?? [:]
for elem in postDict {
let valuesDict = elem.value as? [String : AnyObject] ?? [:]
for kv in valuesDict {
if kv.key == "name" && kv.value.contains(curUserUid) {
MainUsersList.currentChats.append(elem.key)
print(elem.key)
}
}
}
}
myGroup.leave()
})
myGroup.notify(queue: .main, execute: {
//self.loadLastMsgs()
self.ShowVC()
})
和ShowVC方法:
let st = UIStoryboard(name:"Main", bundle: nil)
let anotherVC = st.instantiateViewController(withIdentifier: "messagesVC")
self.present(anotherVC, animated: true, completion: nil)
print("showVC")
在另一个VC中,我在viewDidLoad中有这个代码:
print("!!!!!!!")
print(MainUsersList.currentChats.count)
当我执行按钮单击时,在第一段代码写入的地方,我在控制台中得到它:
!!!!!!!
0
y2MTmBq8o0QF9yxcSBCOpI1DZku2-DnYqmHW2umWaWN54buhtGrXEToW2 //elem.key
showVC
!!!!!!!
1
所以,我的问题是为什么ShowVC在异步任务结束之前执行,为什么它执行两次(我没有另外的代码用print(!!!!!!!))?提前致谢! 附:我没有self.ShowVC()代码写在其他地方肯定
答案 0 :(得分:0)
我弄清楚出了什么问题。我刚刚触发了segue到我的第二个VC,所以我的代码执行了两次。所有其他代码都是正确的)