Flickr から複数の写真をダウンロードするアプリがあります。現在、すべての写真は でNSOperation
実行されるカスタム クラスを使用してダウンロードされます。ただし、非同期の方が効率的であるとNSOperationQueue
聞いたことがあります。この状況ではどちらが優れているのでしょうか? NSUrlConnection
または、これら 2 つよりも優れた 3 番目のオプションはありますか? カスタムは、異なる写真で何度もNSOperation
呼び出すだけです。[NSData dataWithContentsOfURL:]
3 に答える
NSOperation のサブクラスを利用し、非同期モードで使用される NSURLConnection をカプセル化する (デリゲート プロトコルを実装する) アプローチを使用することは、次の側面をさらに考慮すれば、おそらく最も効率的です。
NSOperation サブクラスがデリゲート メソッドを迅速に処理し、基になるスレッド (またはキュー) が応答データの処理に使用されないようにします。理想的には、デリゲート メソッドは部分的な応答データを別のキューまたはスレッドに渡し、そこで処理されます (注: 画像データはバックグラウンド スレッドまたはキューにプリロードされる場合があります!)。
これは、ネットワーク操作が早く終了するほど、1 時間あたりにより多くの要求を実行できるためです。ネットワーク NSOperation は、最大同時操作数が 1 または 2 に設定されている NSOperationQueue に入れられます。めったに 4 以上にはなりません。この設定は、サーバーがパイプラインをサポートしているかどうか、および接続の速度によって異なります。そのキューに「ネットワーク バウンド キュー」という名前を付けます。
「データ処理」(画像データのプリロード) タスクも、理想的には NSOperation のサブクラスです。同様に、「データ処理」操作は、CPU バウンドの NSOperationQueue でキューに入れる必要があります。デフォルトでは、NSOperationQueue の最大同時操作はすでに CPU バウンド操作に適しています。
データをディスクに保存する場合も、理想的には NSOperation を作成し、それらのディスク操作を「ディスク バウンド キュー」にキューに入れます。デバイスでは、これは必要ないように見えますが、まだ古い「ディスク」がある場合は、最大同時操作数をディスクの独立したヘッドの数に設定するのが理にかなっています。;)
まあ、接続が非常に高速で、同時に多くのデータを処理できる場合、これはすべて違いを生むだけかもしれません. デバイスでは 1 秒あたり約 5 メガバイト、ラボ トップではおそらく 25 メガバイトです。
次のチュートリアルをお試しください。
http://maniacdev.com/2010/03/easier-threading-with-nsoperation-for-better-performance
http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues
http://www.icodeblog.com/2012/10/19/tutorial-asynchronous-http-client-using-nsoperationqueue/
また
写真をダウンロードして表のセルに表示する場合は、画像の遅延読み込みを使用できます。
キューイング操作用の機能が組み込まれている AFNetworking ( Github の AFNetworking )を使用することをお勧めします。テーブル ビュー セルに表示する必要がある画像を読み込むためだけに使用する場合は、UIImageView で AFNetworking カテゴリを使用して、これらの画像を非同期的に読み込むことができます。