2

だから私はマルチスレッドとNSOperationについていくつか読んだことがあり、それを使ってアプリを改善する方法を考えています。Instrumentsを使用して、アプリで速度の向上を確実に使用できる場所をいくつか特定しました。私の質問は、これらの種類のものはNSOperationを使用する別のスレッドに適していますか?

ビューの描画:描画に少し時間がかかる、かなり複雑なビューがあります。それが描かれるとき、私はいくらかの遅れを経験します。

オーディオの割り当てと再生:私はAVAudioPlayerいくつかのバックグラウンドミュージックを再生するために使用しています。私がそれを割り当てるとき、再びいくらかの遅れ。

計算:私はまた、いくつかの計算を実行し、多くの整数といくつかの比較を行っています。

私は自分のアプリで可能な限り最高のパフォーマンスを目指していますが、どうしますか?

4

3 に答える 3

5

UIの更新は、バックグラウンドスレッドには適していません。すべてのUI更新は、常にメインスレッドで実行する必要があります。ビューのレンダリングに時間がかかりすぎる場合は、リファクタリング、事前再作成、キャッシュ、またはその他の最適化手段を検討してください。

オーディオコードはバックグラウンドベースにすることができますが、それほど高価であってはなりません

計算は間違いなく心配することなくバックグラウンドで実行できます。

于 2010-10-24T15:17:46.943 に答える
4

私は、バックグラウンドスレッドがUIの更新のために行うことではないことに同意します。UIが何が起こっているかを表示するのを待つ間、ユーザーは「ブロック」されるため、論理的な観点からは意味がなく、他のコーディングの問題が発生する可能性があります。

私がバックグラウンドスレッドに適していると思った最大のことは、多くの場合、非同期操作に関係しています。(AJAX Webページを考えてみてください)。何かが起こっている、ユーザーがUIを操作できるようにしたい場合。良い例は、Webからのあらゆる種類のデータの取得、更新、フェッチです。

同期する必要があると思われる種類のWeb操作(Webサイトからのメッセージのロードなど)を実行している場合でも、どのようなネットワーク状態が発生するかわからないため、おそらく非同期で処理する必要があります。長い時間がかかり、最終的にはタイムアウトまたは失敗する可能性があります。(オーディオの録音のようなものもこのように機能します)。

このような同期データをWebから読み取るときにアプリケーションをブロックしたい場合でも、プログレスバー、スピナーを表示しながら、これを非同期で実行したい場合があります。これにより、バックグラウンドスレッドにデータをロードできます。 (進行中)コントロール、またはユーザーがフォアグラウンドUIスレッドの[キャンセル]ボタンを押すことを許可しました。

「非同期」リクエストは、より長い時間がかかるリクエスト、またはどのくらいの時間がかかるかを判断できないリクエストと考えてください。

于 2010-10-24T21:34:29.080 に答える
3

一部のUI描画メソッドは、iOS4.0でスレッドセーフになりました。

出典:Apple dev:iOSの新機能:iOS 4.0

UIKitでのグラフィックスコンテキストへの描画がスレッドセーフになりました。具体的には:

  • グラフィックスコンテキストへのアクセスと操作に使用されるルーチンは、異なるスレッドに存在するコンテキストを正しく処理できるようになりました。
  • 文字列と画像の描画がスレッドセーフになりました。
  • 複数のスレッドでカラーオブジェクトとフォントオブジェクトを安全に使用できるようになりました。

私のアプリは通常、バックグラウンドスレッドから最も恩恵を受けることがわかりました。

  • Webから物をダウンロードする
  • データベースへの高価なクエリ(読み取り/書き込み)
  • 長時間実行されるアルゴリズム

一部のタスクをバックグラウンドで実行する場合は、NSOperationとNSOperationQueueを使用することをお勧めします。これらは、処理を大幅に簡素化するためです。少し学習曲線がありますが、間違いなくそれだけの価値があります。

頑張ってください!

于 2010-10-24T23:35:52.407 に答える