アプリをInstrumentsでプロファイルする必要があります。システムトレースと同様に、Time Profiler( "Record Waiting Threads"オプションを使用してください)を使用すると便利です。両方とも、「スレッド戦略」ビュー
をメインスレッドに重点を置いて使用するとよいでしょう。 2012年のビデオBuilding Concurrent User Interfaces on iOSという、日付は付けられていますがまだまだ関連性の高いさまざまなアプローチを説明するWWDCビデオがたくさんあります。また、「プロファイリング」と「楽器」を参照する新しいWWDCビデオを探します。
パフォーマンスに悪影響を与える非メインスレッドに関しては、通常はごくわずかですが、何か他のことが起こっている可能性があります。重要な問題は、マルチスレッドをサポートしていない非常に古いデバイスを使用している場合だけです。
ところで、メインスレッドが本当に反応していないことを100%確信していますか?それとも、UIアップデートが適時に反映されていないと思われるのでしょうか?これは、誤ってバックグラウンドスレッドからメインのキューに戻すのではなく、UI更新を実行した結果可能性があります。
さらに具体的な相談が必要な場合は、パフォーマンス問題のreproducible exampleが必要です。しかし要約では、
- メインキューで時間のかかる操作がないことを確認してください。
- すべてのUIアップデートがメインキューに戻されることを確認してください。これには何かが含まれており、UIKitコントロールの更新をトリガーする可能性があります。
- メインスレッドから何かが「待機」していないことを確認してください(セマフォ待ち、操作キューの操作待ち、ディスパッチグループの待機中など)。
- すべての非同期APIがバックグラウンドキューでコンプリートハンドラを呼び出すわけではないことに注意してください(実際には、使い易くするために、多くはメインキューに戻します)。完了ハンドラで、実際にバックグラウンドスレッドで実行されているかどうかを確認します。
出典
2016-08-09 22:30:41
Rob
FYI - 'dispatch_async'はバックグラウンドキューを保証しません。それはあなたがそれに渡すどのキューを使用します。関連するコードで質問を更新してください。 – rmaddy
@rmaddy - もちろんそうです。私たちはさらに進む必要があります。しかし、彼の防衛の中で、彼は「非メインスレッド」に派遣していたと言っていました[sic]。 – Rob
@Rob OPは、「彼」が「メインでないスレッド」にディスパッチしているとは言いません。 OPは 'dispatch_async'が「非メインスレッド」にディスパッチすることを示します。それで私の元のコメント。 – rmaddy