1

私は、ほとんどウェブサイト用のモバイルアプリである iPhone アプリを持っています。それが行うほとんどすべてのことは、サーバーから API メソッドを呼び出すことです。アプリはユーザーの情報を取得し、API を使用してサーバーを更新し続けます。

同僚と、アプリのダウンロード機能に GCD を導入するかどうかについて話し合いました。私の同僚は、UI は画像やテキストなどを表示する前にダウンロードが完了するのを待つ必要があるため、GCD はまったく必要ないと主張しています。私の主張は、(データがない場合でも) UI レンダリングでメイン スレッドをビジー状態に保ち、アプリに GCD を導入してダウンロード用の他のスレッドを作成する必要があるということです。

ここにある議論はどれですか?私の場合、UI がデータなしでレンダリングされると、なんらかの遅延が発生しますか? よりクリーンで洗練された高速なアプリを実現するのはどれですか?

4

4 に答える 4

4

1 つの議論は、次のようなものです。サーバー エンドに問題があるためにダウンロードが失敗し、タイムアウトになった場合はどうなるでしょうか。

  • GCD がないと、UI を 20 秒以上ブロックできないため、アプリはブロックされたままになり、タイムアウト後にクラッシュします。
  • GCD を使用すると、アプリケーションは引き続き機能しますが、データがダウンロードされず、アプリケーションがクラッシュすることはありません。

考慮すべきその他の側面は次のとおりです。

  • 使用しているオブジェクトのスレッド セーフ
  • ユーザーがページから移動したために不要になったダウンロードをどのように処理するか
于 2012-07-12T10:57:54.217 に答える
2

メインスレッドで時間のかかる操作を行うのは良い考えではないと思います。

ユーザーが有意義なことを行う前にデータがダウンロードされるのを待たなければならない場合でも、ユーザーは UI がブロックされることを望んでいません。

ナビゲーター ビューがあり、ユーザーがボタンをタップした後、新しいビューをそれにプッシュして、何かのダウンロードを開始するとします。ユーザーがもう待てないと突然決めた場合は、「戻る」ボタンをタップします。ダウンロード操作が UI をブロックする場合、ユーザーはそれが終了するまで待つ必要があります。これは非常に悪いことです。

于 2012-07-12T11:00:23.923 に答える
1

より適切な質問は、iOS で非同期にダウンロードする方法がいくつかあるため (NSThread、NSOperation、実際には GCD を使用するなど)、非同期でダウンロードするか、アプリのメイン スレッドでダウンロードするかということでしょう。目標を達成するための簡単な方法は、AFNetworkingライブラリを使用することです。これにより、マルチスレッド ネットワーキング / インターネット コードの実装と理解が非常に簡単になります。

個人的には GCD がとても好きで、近いうちに学ぶことをお勧めしますが、それ自体は AFNetworking のようなライブラリ (フードの下で GCD を使用していると思います) と比較して非同期ダウンロードには適していません。

于 2012-07-12T11:32:27.753 に答える
0

NSOperationQueues (舞台裏で GCD を使用) を使用して画像をダウンロードする方法については、こちらの記事を参照してください。チェックアウトできるGithubコードもあります。ユーザーがアプリの別の部分に移動したときに、ダウンロードを一時停止し、新しいダウンロードをキューに入れるための洗練されたソリューションがあります。

http://eng.alphonsolabs.com/concurrent-downloads-using-nsoperationqueues/?utm_medium=referral&utm_source=pulsenews

NSThreads を使用するのではなく、GCD / NSOperationQueues を使用します。コアの基礎について十分に学習すると同時に、優れたアーキテクチャのアプリを作成できます。:)

于 2014-07-18T22:38:07.000 に答える