2016-07-20 4 views
1

Unter der Taste Male ausgeführt wird, habe ich zwei Abschluss-Handler. Aus irgendeinem Grund wird der zweite Handler gleichzeitig mit dem ersten Beendigungshandler ausgeführt. Ich bin mit Grand Central Dispatch sehr vertraut (habe meine fehlgeschlagenen Versuche gelöscht), aber ich versuche, dies mit GCD so einzurichten, dass NUR der erste Completion-Handler ausgeführt wird und dann der zweite Handler ausgeführt wird.Wie ein Block von Code nur nach der anderen Block von Code auszuführen

@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) 

     } 

Antwort

0

können Sie einen dispatch_group verwenden, um die zwei Aufgaben zu synchronisieren.

  1. Erstellen Sie eine Versandgruppe mit dispatch_group_create().
  2. Rufen Sie für jede Aufgabe dispatch_group_enter().
  3. Wenn die Aufgabe abgeschlossen ist, rufen Sie dispatch_group_leave().
  4. Warten Sie auf die Aufgaben, die von dispatch_group_notify() Aufruf abzuschließen.

Beispiel:

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() 
} 

Tipp: die Ereignis Beobachter entfernen, sobald sie verarbeitet sind, sonst werden Sie nur halten eine neue Referenz jedes Mal Beibehaltung der IBAction genannt wird.

Verwandte Themen