3

サーバーからjsonデータをダウンロードして処理するネットワークベースのiOSアプリを開発しています。ダウンロード タスクと処理タスクの両方が完了するまでにかなりの時間がかかる可能性があるため、どちらもメイン スレッドで実行したくありません。

これを行うには2つの方法があると思います:

  1. を使用して非同期ロードを実行NSURLConnectionし、didFinishLoadingメソッドでGCD (たとえば) を使用してバックグラウンドで処理を行います。

  2. GCD の dispatch_async(たとえば) を使用してバックグラウンドで作業を開始し,NSURLConnection's sendSynchronousRequest:returningResponse:errorデータを同期的にダウンロードするために使用します. データの処理を行いUIます. メインスレッドで更新を呼び出します.

特に、1 つの「データのダウンロード/処理」タスクにデータ ダウンロードのための複数の連続したサービス呼び出しが含まれる場合は、2 番目の方法の方が簡単に記述でき、よりクリーンなコードが生成されると思います。したがって、実行が次のようになるのではなく:

main (開始) -> バックグラウンド (ダウンロード) -> メイン (NSURLConnectionDelegateメソッド) -> バックグラウンド (データ処理) -> メイン (UI更新)

次のようになります。

メイン (開始) -> バックグラウンド (ダウンロード) -> バックグラウンド (データ処理) -> メイン (UI 更新) のほうがすっきりしているように見えます。

2 つの同様の質問が見つかりました: Grand Central Dispatch を使用したインターネット リクエストの良いパターン? そして
NSURLConnection とグランドセントラルディスパッチ

そして、両方に対する答えは、方法1と概念的に似たものを使用することを示唆しているようです.

方法 2 で説明されていることを達成する適切な方法はありませんか?

前もって感謝します!

4

1 に答える 1

0

選択肢 2 を追求する気はありません。一定の単純さを享受sendSynchronousRequestできますが、ダウンロード中の進行状況の更新、要求をキャンセルする機能 (およびその他のより複雑なシナリオ) を利用できません。NSURLConnectionDataDelegateアプローチにより、ネットワーク リクエストをより詳細に制御できます。

この質問は GCD ベースのパターンを想定していますが、オペレーション キューのパターンは考慮に値すると思います。メソッドによって提供される制御をNSURLConnectionDataDelegate、ネットワーク要求をカプセル化するキャンセル可能な操作と組み合わせることができます。より高度になり始めたら、同時リクエストの採用を開始できますが、同時実行の程度を制限することもできます (たとえば、同時リクエストを 5 つ以下に制限するなど)。

AFNetworkingをご覧になることをお勧めします。そのフレームワークを使いたくないかもしれませんが、それが採用しているオペレーション キュー ベースのパターンを見てみたいと思います。個人的には、前述の GCD アプローチのいずれかよりもそのパターンを使用します。

于 2013-09-29T01:18:22.893 に答える