0

私は最近、GCD と非同期のレンダリングとデータ検索の作業をたくさん行っていますが、非同期がどのように行われるかについてのメンタル モデルをしっかりと固める必要があります。

一連のメソッドに注目したいと思いsetNeedsDisplayます。NSURLConnectionDelegate

  1. setNeedsDisplay を非同期で呼び出すのは正しいですか? 私はよくそれを呼んでdispatch_async(dispatch_get_main_queue(), ^{})混乱します。
  2. コールバックは非同期として説明されていNSURLConnectionDelegateますが、実際にはメイン スレッド/実行ループで同時に実行されるわけではありません。私はここでの区別についてはあいまいです。

より一般的には、GCD の最新の iOS 時代では、GCD を作成するためのベスト プラクティスと、これらの方法がうまく連携します。私は定期的に使用していて、トラブルに巻き込まれないように努めているため、ここで一般的なガイドラインを探しています。

乾杯、
ダグ

4

1 に答える 1

0
  1. setNeedsDisplayいいえ、通常は非同期で呼び出しません。ただし、これをメイン キュー以外のキューから呼び出している場合 (そうであると思います)、バックグラウンド キューから UI の更新を行うべきではないことに注意してください。これらは常にメイン キューから実行します。したがって、これは UI 更新をバックグラウンド キューからメイン キューにディスパッチする非常に典型的なパターンのように見えます。

  2. NSURLConnectionこれを呼び出すと、 を使用しない限りsendSynchronousRequest、アプリは接続の進行中にすぐに戻るため、非同期と呼ばれます。デリゲート イベントがメイン キューにあるという事実は、接続自体が非同期であるという概念と相容れないものではありません。個人的には、プロセスが開始されたのと同じキューから呼び出されていないいくつかのメソッドをデリゲートできるとしたら、それがインターフェースを介してかなり明示的でない限り、悪い形だと思っていたでしょう。

  3. 質問のタイトルの質問に対して、NSURLConnectionGCD を内部で使用するか、別の同時実行テクノロジ ( NSOperationQueue、スレッドなど) を使用するかは、アプリケーション開発者として一般的に心配しない内部実装の問題です。

  4. ガイドラインに関するあなたの最後のフォローアップの質問に対して、私は上でほのめかした一般的なルールを志願します。つまり、ユーザー インターフェイスをブロックするすべての時間のかかるプロセスはバックグラウンド キューにディスパッチする必要がありますが、バックグラウンド キューで必要な後続の UI 更新はメイン キューにディスパッチする必要があります。これは、私が考えることができる最も一般的な経験則であり、一般的に並行プログラミングを行う理由と、適切に行う方法を要約しています。

于 2013-01-10T14:07:56.873 に答える