在按钮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 :(得分:0)
您可以使用dispatch_group来同步这两项任务。
dispatch_group_create()
创建一个调度组。dispatch_group_enter()
。dispatch_group_leave()
。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
时都会保留新的引用。