如何在执行另一个代码块之后执行代码块

时间:2016-07-20 09:03:48

标签: swift closures grand-central-dispatch

在按钮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)

        }

1 个答案:

答案 0 :(得分:0)

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

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

    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时都会保留新的引用。