2016-07-20 117 views
1

在按钮Male下,我有两个完成处理程序。出于某种原因,第二个处理程序与第一个完成处理程序同时运行。我非常不熟悉Grand Central Dispatch(已经删除了我的失败尝试),但是我希望使用GCD进行设置,只有在第一个完成处理程序执行完毕后才执行第二个处理程序。如何在执行另一个代码块后才执行代码块

@IBAction func Male(sender: AnyObject) { 

FIRDatabase.database().reference().child("users").child(self.userdefaults.objectForKey("FBid") as! String).child("anonymous chatting").child("Males").child("Non-Chatting").observeEventType(.Value, withBlock: { (snapshot2: FIRDataSnapshot!) in 

       self.nonChatting = Int(snapshot2.childrenCount) 

       print("yobitch\(self.nonChatting)") 

       }, withCancelBlock: nil) 

//^^^^^^^^^^^^EXECUTE THIS COMPLETION HANDLER FIRST    

    FIRDatabase.database().reference().child("users").child(self.userdefaults.objectForKey("FBid") as! String).child("anonymous chatting").child("Males").child("Non-Chatting").observeEventType(.ChildAdded, withBlock: { (snapshot) in 

       if let dictionary = snapshot.value as? [String: AnyObject] { 

        if self.Malecount < self.listofMaleFriends.count { 
         self.idArray.append(dictionary) 
         self.Malecount += 1} 
     } 

       self.loopCount += 1 
       if self.loopCount == self.listofMaleFriends.count-(self.matchingLoopCount) { 
       self.loopCount = 0 
       self.matchingLoopCount += 1 
        if self.idArray.count == self.listofMaleFriends.count-(self.Othercount){ 
         let randomNumber = Int(arc4random_uniform(UInt32(self.idArray.count))) 
         if self.idArray.isEmpty{ 
         } 
         else{ 

          let Dictionaire = self.idArray[randomNumber] as! [String: AnyObject] 
          let id = Dictionaire["id"] as! String 
          let gender = Dictionaire["gender"] as! String 
          let name = Dictionaire["name"] as! String 
          self.idArray.removeAtIndex(randomNumber) 
          self.Othercount += 1 /* Reduces Male Count*/ 

       let ref = FIRDatabase.database().referenceFromURL("https://game-of-chats-ce897.firebaseio.com/").child("users").child(self.userdefaults.objectForKey("FBid") as! String).child("anonymous chatting").child("Males").child("Chatting").child(id) 
       let refout = FIRDatabase.database().referenceFromURL("https://game-of-chats-ce897.firebaseio.com/").child("users").child(self.userdefaults.objectForKey("FBid") as! String).child("anonymous chatting").child("Males").child("Non-Chatting").child(id) 
       ref.setValue(["id": id, "gender": gender, "name": name]) 
       refout.removeValue() 

        //let user = User() 
        // user.id = self.friendId 
        // user.name = self.friendName 
        // showChatControllerForUser(user) 
        self.user.id = Dictionaire["id"] as! String 
        self.user.name = Dictionaire["name"] as! String 
        //let chatLogController = ChatLogController(collectionViewLayout: UICollectionViewFlowLayout()) 

        // self.(chatLogController, animated: true, completion: nil) 
        //self.navigationController?.pushViewController(chatLogController, animated: true) 
       self.showChatControllerForUser() 

         }}} 

      }, withCancelBlock: nil) 

     } 

回答

0

您可以使用dispatch_group来同步这两个任务。

  1. 使用dispatch_group_create()创建一个调度组。
  2. 对于每项任务,请致电dispatch_group_enter()
  3. 任务完成后,请致电dispatch_group_leave()
  4. 通过致电dispatch_group_notify()等待任务完成。

例子:

let node = FIRDatabase.database().reference().child("users").child(self.userdefaults.objectForKey("FBid") as! String).child("anonymous chatting").child("Males").child("Non-Chatting") 

let group = dispatch_group_create() 

// Second handler 
dispatch_group_enter(group) 

node.observeEventType(.Value, 
    withBlock: { (snapshot2: FIRDataSnapshot!) in 
     // Handle event... 
     dispatch_group_leave(group) 
    }, 
    withCancelBlock: nil 
) 

// First handler 
dispatch_group_enter(group) 

node.observeEventType(.ChildAdded, 
    withBlock: { (snapshot) in 
     // Handle event 
     dispatch_group_leave(group) 
    } 
    withCancelBlock: nil 
) 


dispatch_group_notify(group, dispatch_get_main_queue()) { 
    self.showChatControllerForUser() 
} 

提示:删除事件观察家一旦他们处理,否则你将只保留每个IBAction被调用时保留了新的参考。