2016-08-09 3 views
2

私のアプリに新しいデータ読み込み機能を追加しました。大規模なデータベースの内容をモバイルデバイスからバックエンドに転送して処理することを意味します。これまで機能していたこのパイプラインでは、関数の全内容が内部にあります。メインスレッドで何が実行されているかを判断する方法+ UIを遅くする方法はありますか?

dispatch_async 

これは非メインスレッドにディスパッチされます。また、これらが機能していることをログで確認しました。パイプラインに沿ったすべての機能はメインスレッドから外れています。それでも、私はUIのフリーズアップを経験しています。

質問:

  1. メインスレッドと何が待っている/やっている上にあるかを把握するための最良の方法は何ですか?
  2. メイン以外のスレッドが実際にメインスレッドに影響を与えるほど多くのことを行うことは可能ですか?
+0

FYI - 'dispatch_async'はバックグラウンドキューを保証しません。それはあなたがそれに渡すどのキューを使用します。関連するコードで質問を更新してください。 – rmaddy

+0

@rmaddy - もちろんそうです。私たちはさらに進む必要があります。しかし、彼の防衛の中で、彼は「非メインスレッド」に派遣していたと言っていました[sic]。 – Rob

+0

@Rob OPは、「彼」が「メインでないスレッド」にディスパッチしているとは言いません。 OPは 'dispatch_async'が「非メインスレッド」にディスパッチすることを示します。それで私の元のコメント。 – rmaddy

答えて

0

私は、ツールを使用して、タイムプロファイラ、割り当て、システム使用などのツールを使用できます。xcodeまたはXcodeでコマンド+ iを使用するツールを開くには>オープンデベロッパーツール]> [計測器]を選択します。

+0

バックグラウンドスレッドで更新されているアイテムでこのUI操作を分析する方法を共有できますか? –

+0

「この」UI操作の詳細を教えてください。 –

4

アプリをInstrumentsでプロファイルする必要があります。システムトレースと同様に、Time Profiler( "Record Waiting Threads"オプションを使用してください)を使用すると便利です。両方とも、「スレッド戦略」ビューenter image description hereをメインスレッドに重点を置いて使用するとよいでしょう。 2012年のビデオBuilding Concurrent User Interfaces on iOSという、日付は付けられていますがまだまだ関連性の高いさまざまなアプローチを説明するWWDCビデオがたくさんあります。また、「プロファイリング」と「楽器」を参照する新しいWWDCビデオを探します。

パフォーマンスに悪影響を与える非メインスレッドに関しては、通常はごくわずかですが、何か他のことが起こっている可能性があります。重要な問題は、マルチスレッドをサポートしていない非常に古いデバイスを使用している場合だけです。

ところで、メインスレッドが本当に反応していないことを100%確信していますか?それとも、UIアップデートが適時に反映されていないと思われるのでしょうか?これは、誤ってバックグラウンドスレッドからメインのキューに戻すのではなく、UI更新を実行した結果可能性があります。

さらに具体的な相談が必要な場合は、パフォーマンス問題のreproducible exampleが必要です。しかし要約では、

  • メインキューで時間のかかる操作がないことを確認してください。
  • すべてのUIアップデートがメインキューに戻されることを確認してください。これには何かが含まれており、UIKitコントロールの更新をトリガーする可能性があります。
  • メインスレッドから何かが「待機」していないことを確認してください(セマフォ待ち、操作キューの操作待ち、ディスパッチグループの待機中など)。
  • すべての非同期APIがバックグラウンドキューでコンプリートハンドラを呼び出すわけではないことに注意してください(実際には、使い易くするために、多くはメインキューに戻します)。完了ハンドラで、実際にバックグラウンドスレッドで実行されているかどうかを確認します。
関連する問題