1. ホーム
  2. ios

[解決済み] DispatchQueue.main.asyncとDispatchQueue.main.syncの相違点

2022-05-10 03:49:37

質問

私はこれまで DispatchQueue.main.async は、UI関連の操作を実行するために長い間使用されてきました。



Swiftでは DispatchQueue.main.asyncDispatchQueue.main.sync であり、どちらも主キューで実行される。



この2つの違いについて教えてください。 

どのような場合にそれぞれを使うべきでしょうか?



DispatchQueue.main.async {
    self.imageView.image = imageView
    self.lbltitle.text = ""

}

DispatchQueue.main.sync {
    self.imageView.image = imageView
    self.lbltitle.text = ""
}

解決方法は?

を使用する場合 async は、ディスパッチされたブロックが実行されるまで待たずに、呼び出し側のキューを先に進ませることができます。逆に sync は、呼び出し側のキューを停止させ、ブロック内でディスパッチした作業が終了するまで待機させます。したがって sync はデッドロックにつながる可能性があります。試しに DispatchQueue.main.sync をメインキューから呼び出すと、呼び出し側のキューはディスパッチされたブロックが終了するまで待ちますが、(キューが停止して待っているため)起動すらできないので、アプリはフリーズします。

を使用する場合 sync ? 別のキューで行われる作業を待ち、その後に現在のキューで作業を継続する必要がある場合。

syncの使用例です。

シリアルキューでは sync をミューテックスとして使用することで、1つのスレッドだけが同時に保護されたコードを実行できるようにします。