锁定和解锁dispatch_queue_t异步任务
问题描述:
我想锁LockQueue2
完成过程,当解锁LockQueue2
显示“号码是:”number
在dispatch_after
。锁定和解锁dispatch_queue_t异步任务
我需要这样的输出:
数设置值1
数为1
数设置值2
数为2
数设定值3
数为3
let LockQueue = dispatch_queue_create("LockQueue", nil)
func test(num :Int){
var number = 0
let LockQueue2 = dispatch_queue_create("LockQueue2", nil)
dispatch_async(LockQueue){
LockQueue2.lock()
// any process or waiting
sleep(2)
dispatch_sync(LockQueue2) {
number = num
print("number set value ", number)
LockQueue2.unlock()
}
}
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)){
// any process or waiting
sleep(3)
dispatch_after(LockQueue2) {
print("number is :", number)//*** show number set in last dispatch ***
}
}
}
test(1)
test(2)
test(3)
答
如果哟你就像处理简单的同步任务,像你这样,你可以只使用一个串行队列:
let serialQueue = dispatch_queue_create("com.domain.app.serialqueue", nil)
func simpleSerialQueue(num: Int) {
var number = 0
dispatch_async(serialQueue){
sleep(2)
number = num
print("number set value: ", number)
}
dispatch_async(serialQueue) {
print("number is:", number)//*** show number set in last dispatch ***
}
}
simpleSerialQueue(1)
simpleSerialQueue(2)
simpleSerialQueue(3)
或者,如果你有,而您想等待它完成异步任务,你可以使用信号:
let serialQueue = dispatch_queue_create("com.domain.app.serialqueue", nil)
func semaphoreExample(num: Int) {
var number = 0
let semaphore = dispatch_semaphore_create(0)
// this will fire in 2 seconds
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(NSEC_PER_SEC * 2)), serialQueue) {
number = num
print("number set value: ", number)
dispatch_semaphore_signal(semaphore);
}
// this will start immediately, but will wait until the above semaphore is signaled
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
print("going to wait for semaphore")
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
print("number is:", number)
}
}
semaphoreExample(1)
坦率地说,信号很可能是我最后的解决方案,一般,其他方法处理这个更优雅。例如,在处理异步进程时,我可能会使用异步的NSOperation
子类:它需要更多的前置设置,但非常优雅地处理异步任务。有关可靠的示例,请参见WWDC 2015 Advanced NSOperations。
+0
这是非常非常完整的答案,第2节解决了我的问题,非常感谢。 – solan
如果你想在某个随机线程上等待另一个线程的进程,你可能会使用信号量,而不是锁。所以,创建一个信号量,让第二个进程等待一个信号,然后让第一个进程发出信号量。或使用串行队列。 – Rob
谢谢亲爱的@Rob,你能举个例子吗? – solan