5

NSOperationQueueで同期NSURLConnection要求(またはスレッド(メインスレッドではない)からの同期要求)を行う操作を追加することと、メインスレッドから非同期要求を行うことの違いは何ですか?

どちらもメインスレッドをブロックしないため、UIは応答性を維持しますが、一方を他方よりも使用する利点はありますか?後の方法でリクエストの進行状況などを追跡できることはわかっていますが、ここでは進行状況やその他のHTTP関連のものは重要ではないと想定しています。

4

3 に答える 3

5

それらは非常に似ています。同期リクエストの最大の問題は、簡単にキャンセルできないことです。アプリケーションによっては、それが問題になる可能性があります。大きなドキュメントをダウンロードしていて、ユーザーが別の画面に移動したため、その情報が不要になったとします。私たちの場合、私は実際にセカンダリNSThreadで非同期NSURLConnectionsを実行することを選択しました。これは、一部のアプリではやり過ぎかもしれません。より複雑ですが、リクエストをキャンセルする機能と、セカンダリスレッドでJSON / XML /画像データをデコードする機能の両方を提供するため、メインスレッドのユーザーの双方向性に影響を与えません。

于 2012-09-02T22:28:08.707 に答える
2

歴史的な見解は、非同期リクエストでは、消費電力、したがってバッテリー寿命に利点があるというものでした。おそらく、古いデリゲートアプローチと新しいブロックベースのアプローチの両方が含まれます。

于 2012-09-02T18:44:16.733 に答える
2

非同期要求は実行ループでスケジュールされ、実行ループソースとしてセットアップされ、ネットワークから(任意のソケットソースとして)データを受信した場合にのみコードが自動的にトリガーされます。

同期要求を実行するとNSThread、スレッドが独占されて着信データが監視されますが、これは一般的に非常にやり過ぎです。

メソッドNSURLConnectionを使用すると、非同期で実行された場合でも、いつでもキャンセルできます。cancel

NSOperationQueue( )で非同期リクエストを送信できる新しいAPIを使用すると、+sendAsynchronousRequest:queue:completionHandler:内部でGCDを使用するなど、実行ループでスケジュールされているdispatch_source_create場合と同じように動作し、追加のスレッドを使用しないようにすることができます。 NSURLConnection(スレッドが悪であり、その使用を最小限に抑える必要がある理由を説明するWWDC'12ビデオをご覧ください)。違いは、デリゲートメカニズムを使用する代わりに、完了時に通知されるブロックを使用できることだけです。

数年前、NSURLConnection非同期呼び出しと委任管理を優れたブロックAPI( githubのOHURLLoaderを参照)に組み込んだクラスを作成しました。これにより、使いやすくなりました(お気軽にご覧ください)。sを使用する新しいAPINSOperationQueueは同じ原則を使用し、runloopで非同期リクエストを実行しますが、デリゲートを実装する代わりにブロックを使用できるようにします。

于 2012-09-02T22:47:41.833 に答える