jsh*_*hah 2 semaphore ios swift
我对使用信号量相当陌生,所以我不确定我是否正确使用它。
当我尝试这样做时:
var group = dispatch_group_create();
dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)){
var myRef = self.userRef.childByAppendingPath(self.userRef.authData.uid)
myRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
// do some stuff once
println("WE ARE IN HERE")
firstName = snapshot.value["firstName"] as String!
lastName = snapshot.value["lastName"] as String!
})
}
dispatch_semaphore_wait(group, DISPATCH_TIME_FOREVER)
dispatch_semaphore_signal(group)
println("WE MADE IT OUT OF THERE")
Run Code Online (Sandbox Code Playgroud)
输出始终是:
"WE MADE IT OUF OF THERE"
"WE ARE IN HERE"
Run Code Online (Sandbox Code Playgroud)
为什么它不等待我的信号量完成后再执行其余代码?
编辑:
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> () in
// do some task
var myRef = self.userRef.childByAppendingPath(self.userRef.authData.uid)
myRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
// do some stuff once
println("WE ARE IN HERE")
firstName = snapshot.value["firstName"] as String!
lastName = snapshot.value["lastName"] as String!
})
});
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> () in
// do some task
var standbyData = [
"firstName":firstName,
"lastName":lastName,
"duration":self.helpDurationLabel.text!,
"radius":self.helpRadiusLabel.text!,
"categories": categories,
"time_stamp":self.date.timeIntervalSince1970
]
println("WE ARE OUT HERE")
var standbyUserRef = self.standbyRef.childByAppendingPath(self.userRef.authData.uid)
standbyUserRef.updateChildValues(standbyData)
});
Run Code Online (Sandbox Code Playgroud)
因为我将 2 个同步线程放入同一个队列中,所以这不应该起作用吗?
您混淆了几个概念:调度组和信号量用于不同的目的。您需要 (1) 创建一个信号量,(2) 在块中发出信号量信号,以及 (3) 等待块外的信号量:
\n\n注意:这将阻止它在等待时运行的任何线程,因此如果它在主线程上,它将挂起用户交互\xe2\x80\x94这不是一个好主意。你最好阅读Apple的并发编程指南以了解其余概念。
\n\nvar semaphore = dispatch_semaphore_create(0)\ndispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)){\n var myRef = self.userRef.childByAppendingPath(self.userRef.authData.uid)\n myRef.observeSingleEventOfType(.Value, withBlock: { snapshot in\n // do some stuff once\n println("WE ARE IN HERE") \n firstName = snapshot.value["firstName"] as String!\n lastName = snapshot.value["lastName"] as String!\n })\n dispatch_semaphore_signal(semaphore)\n}\ndispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)\nprintln("WE MADE IT OUT OF THERE")\nRun Code Online (Sandbox Code Playgroud)\n