web-dev-qa-db-ja.com

メインスレッドのdispatch_get_main_queue()

場合によってはUIを変更するメソッドがあります。

例えば:

_-(void) myMethod {

  if(someExpressionIsTrue) {
    // make some UI changes
    // ...
    // show actionSheet for example
  }
}
_

時々myMethodmainThreadから呼び出されることもありますが、ある_other thread_から呼び出されることもあります。

だからこそ、これらのUIの変更をmainThreadで確実に実行したいのです。

myMethodの必要な部分を次のように変更しました。

_if(someExpressionIsTrue) {
     dispatch_async(dispatch_get_main_queue(), ^{
        // make some UI changes
        // ...
        // show actionSheet for example
      });
}
_

質問:

  • 呼び出すのは安全で良い解決策ですかdispatch_async(dispatch_get_main_queue()メインスレッド内?パフォーマンスに影響しますか?
  • この問題は他のより良い方法で解決できますか? _[NSThread isMainThread]_メソッドを使用してメインスレッドであるかどうかを確認し、他のスレッドの場合にのみ_dispatch_async_を呼び出すことができることを知っています、しかし、これらのUIの更新でもう1つのメソッドを作成したりブロックしたりします。
25
B.S.

メインキュー内からメインキューに非同期ブロックを追加しても問題はありません。実行ループでメソッドを実行するだけです。

絶対にしたくないのは、dispatch_sync自分自身をロックしてしまうため、メインキュー内からメインキューにブロックを追加します。

37
Abizern

メインスレッドでdispatch_asyncを呼び出しているかどうかは心配しないでください。 iOSはブロックをキューに入れ、メインスレッドでブロックを実行します。

6
Zhengming Ying