2016-07-20 114 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被調用時保留了新的參考。