2016-07-20 4 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 называется.

Смежные вопросы