1

iOSのどのマルチスレッドツールを使用してサービスを利用したり、サービスデータに基づいてUIを変更したりするのか混乱しています。

  1. 最初に、NSURLConnectionとそのデリゲートを使用することに慣れ、didreceiveresponse、didreceivedataなどのデリゲートを使用してタスクを実行しました
  2. 次に、GCDを学習して使用し、ブロックコード内からサービスをヒットしてUIを更新しました
  3. 今、私はperformSelectorInBackground()を使用してバックグラウンドスレッドで作業することを学んでいます

どのツールをどこで使用するかについて明らかに混乱していますか?

4

3 に答える 3

2
  1. NSURLConnectionデリゲートコールを使用するのは、リモートサーバーからデータを受信する「昔ながらの」方法です。また、単一のクラス内の少数のNSURLConnectionインスタンス(UIViewControllerまたはそうでないもの)で使用するのは実際には快適ではありません。ここでsendAsynchronousRequest..、完了ハンドラーを使用してメソッドを使用することをお勧めします。完了ハンドラーを実行する操作キュー(UIのメイン、またはその他のバックグラウンドキュー)を定義することもできます。
  2. GCDは、メソッドを使用してリモートリソースをフェッチするだけでなく、さまざまなタスクに適していinitWithContentsOfURL:ます。ブロックを受け取るキューのタイプ(同時、シリアルなど)を制御することもできます。
  3. performSelectorInBackground:また、バックグラウンドスレッドでメソッドを実行する「古い学校」の方法でもあります。ARCを使用していない場合は、メモリリークを回避するために、個別の自動解放プールを設定する必要があります。また、特定のセレクターに対して任意の数のパラメーターを受け入れることができないという制限もあります。この場合、を使用することをお勧めしますdispatch_async

NSOperationQueuewithNSOperationとそのサブクラス(NSInvocationOperation& )もありNSBlockOperation、バックグラウンドでタスクを実行したり、完了したタスクに関する通知をメインスレッドで取得したりできます。IMHO操作の独自のサブクラスを作成したり、それらの間の依存関係を定義したりできるという点で、GCDよりも柔軟性があります。

于 2012-12-27T17:22:00.890 に答える
1

最も重要なことは、メインスレッド以外の別のスレッドでUIを変更 しないことです。

あなたが言及したすべてのポイントは、バックグラウンドで同じ手法を使用していると思います:GDC。しかし、それはよくわかりません。

とにかく、スレッドに関してどのツールを使用するかは問題ではありません。
それはむしろあなたの目的の問題です。小さい画像またはほんの少しのデータをフェッチしたくない場合contentsOfURLは、performSelectorInBackground()またはGDCディスパッチブロックで使用できます。
より多くのデータと進行状況やエラー処理などのより多くの情報に関する場合は、*NSURLConnection`を使用する必要があります。

于 2012-12-27T17:25:01.807 に答える
0

すべての場合にGCDを使用することをお勧めします。他の手法はまだ存在しますが、主に下位互換性のためです。

GCDは(少なくとも)3つの理由で優れています:

  1. 非常に使いやすく、ブロックを使用しているため、コードは非常に読みやすくなっています。
  2. NSOperationのようなものよりもレベルが低いため、高性能のマルチスレッドが必要な場合ははるかに高速です。
  3. 軽量で邪魔にならないため、メソッドの途中でスレッド管理を追加するときにコードを大幅に変更する必要はありません。
于 2012-12-27T17:25:34.470 に答える