2016-04-21 86 views
1

我想锁LockQueue2完成过程,当解锁LockQueue2显示“号码是:”numberdispatch_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) 
+0

如果你想在某个随机线程上等待另一个线程的进程,你可能会使用信号量,而不是锁。所以,创建一个信号量,让第二个进程等待一个信号,然后让第一个进程发出信号量。或使用串行队列。 – Rob

+0

谢谢亲爱的@Rob,你能举个例子吗? – solan

回答

0

如果哟你就像处理简单的同步任务,像你这样,你可以只使用一个串行队列:

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