2019年6月20日木曜日

Swift3のDispatch semaphore

同期処理や非同期処理などを制御する仕組み。
Objective-Cと書き方がだいぶ変わったみたいなんでまとめる。
まだよくわかってないんで、書きかけとする。

言葉の意味

dispatch = 使者や手紙などを送る
semaphore = 手旗信号

要するに処理待ちのカウンターみたいなもので、値がマイナスの間はスレッドが停止する。
希望の処理が完了したら値をプラスしてやり、それが0になったらスレッド再開。

書式

詳しくは公式サイトで。

semaphoreを作る

let semaphore = DispatchSemaphore(value: 0)

semaphoreを通知、または増やす


semaphore.signal()

semaphoreを待つ、または減らす


semaphore.wait()
_ = semaphore.wait(timeout: DispatchTime.distantFuture
semaphore.wait(wallTimeout: DispatchWallTime)

同期処理させたいコードを書くところ

DispatchQueue.global(qos: .background).async { ここ }

具体的書き方

  1. semaphoreを作る
  2. DispatchQueue.global(qos: ここ).async { }の引数に優先順位を書く。
  3. DispatchQueue.global(qos: .xxxxx).async { ここ }のクロージャ内に同期処理させたいコードを書く
  4. 処理が一件終了したらsemaphore.signal( )を実行して待ち行列を解消して次の処理に移る。
  5. クロージャの最後にどれくらい待つのかを書く(たとえば処理が終わるまでずっと(以前はFOREVERとかなんとか書いてたけど、今はdistantFuture(遠い未来)だそうだ)とか)

let semaphore = DispatchSemaphore(value: 0)

_ = semaphore.wait(timeout: DispatchTime.distantFuture)

0 件のコメント:

コメントを投稿