私は長い間スタックオーバーフローを見てきましたが、最初の質問をする機会が本当になかったので、ここにあります:
私は mac os x アプリを開発しており、アプリの応答性を維持するために nsoperations を使用しています。また、maxConcurrentOperationCount を 3 に設定していますが、ウィンドウを移動しようとすると、アプリはまだ応答しません。遅れて不規則に振る舞う
誰かが解決策への手がかりや指針を提供できますか? (いいえ、サンプルコードを求めていません;)
私は長い間スタックオーバーフローを見てきましたが、最初の質問をする機会が本当になかったので、ここにあります:
私は mac os x アプリを開発しており、アプリの応答性を維持するために nsoperations を使用しています。また、maxConcurrentOperationCount を 3 に設定していますが、ウィンドウを移動しようとすると、アプリはまだ応答しません。遅れて不規則に振る舞う
誰かが解決策への手がかりや指針を提供できますか? (いいえ、サンプルコードを求めていません;)
このような状況でアプリが応答しなくなる理由はいくつかあります。
あなたはまっすぐにメインイベントループをブロックしているか、イベントでフラッディングしています
メインスレッドで複雑な描画操作を行っている
アプリが大量のメモリを使用しているため、システムのページングが発生しています。10 スレッドでも 1 スレッドでも問題ありません。ページングを開始するとすぐにパフォーマンスが低下します。
メイン スレッドとバックグラウンド スレッド/キューの間でロック競合が発生している
Instruments は、CPU 使用率をプロファイリングするための一連のツールを提供しています。私が最初にすべきことは、メイン スレッドが大量の CPU を使用しているかどうか (そして、そうであれば何のために使用しているのか)、またはロックなどで待機してブロックされているかどうかを把握することです。
アプリが応答しなくなった場合は、コード内のどこかでメイン スレッドをブロックしている可能性があります。アクティビティ モニターまたはインスツルメント (推奨) を使用してサンプルを取得し、コード内の場所を見つけてください。
NSOperations を使用するだけでは、アプリは応答しません。応答性の鍵は、メイン スレッドをブロックしないことです。アプリが遅い場合、それは (通常 — @bbum の回答を参照) メイン スレッドをブロックしている何かを実行しているためです。
インストゥルメントを使用することを見つける方法。Time Profiler インストゥルメントを使用して、メイン スレッドで何が実行されているかを確認します。それらを小さくするか、オペレーションに移すか、実行を遅らせるか、またはそれらの組み合わせを行います。リファクタリングが必要な場合は、それを実行してください。
1 つの可能性は、メイン キューで操作を実行していることです。そうしないでください。これらmaxOperationCountはメイン スレッドで (に関係なく) シリアルに実行されます。キューを作成し、作成したキューを使用します。