2017-06-21 111 views
0

我正在使用哪个数据库火力点,在这个时候我试图使用这段代码从我读的基础数据异步一个项目:麻烦异步任务

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) 

当我执行一个按钮,磨片重码第一块写的是我得到这个控制台:

!!!!!!!

y2MTmBq8o0QF9yxcSBCOpI1DZku2-DnYqmHW2umWaWN54buhtGrXEToW2 //elem.key

showVC

!!!!!!!

所以,我的问题是,为什么ShowVC异步任务执行前结束,以及为什么它执行两次(我没有其他代码打印(!!!!!!!))?提前致谢! P.S.我没有self.ShowVC()代码写在其他地方肯定

+0

了解如何异步任务的工作。在你的情况下,该组根本不需要。只需将'myGroup.leave()'替换为'self.ShowVC()'并删除所有其他与DispatchGroup相关的代码即可。 *不要问,告诉!* – vadian

+0

不幸的是,结果是一样的 – Burning

回答

0

我已经找出了错在哪里。我刚刚触发了我的第二个VC,让我的代码执行了两次。所有其他代码是正确的)