2016-04-21 7 views
1

ロックをLockQueue2にしてロックを解除し、ロックを解除するとLockQueue2は「番号は」と表示されます。numberdispatch_afterです。非同期タスクでdispatch_queue_tをロックしてロック解除します

私はこの出力を必要とする:

数設定値1
数が2
数が3
数が3

ある2
数設定値である1
番号設定された値であります
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

ランダムなスレッドのプロセスが別のプロセスを待つようにするには、セマフォーを使用してください。したがって、セマフォを作成し、2番目のプロセスがシグナルを待つようにしてから、そのセマフォを最初にプロセスシグナルにします。またはシリアルキューを使用します。 – Rob

+0

おかげで@Lob、私に例を挙げてもらえますか? – solan

答えて

0

yo

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) 

それとも、あなたはそれが完了するまで待機したかったため、非同期タスクを持っていた場合、あなたが使用できます。u'reはあなたのような、簡単な同期タスクにされて扱う、あなただけのシリアルキューを使用することができますセマフォ:

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

関連する問題