2016-04-21 123 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