2

分析に外部ライブラリを使用するアプリケーションがあります。問題は、同期的にいくつかのことを行っていると思われることです。これにより、スレッドがブロックされ、ウォッチドッグが 10 秒後にアプリを強制終了します (0x8badf00d コード)。再現するのは本当に難しいですが(私にはできません)、「野生の」ケースはほとんどありません。

代わりに別のスレッドを作成する代わりに、実行ループを使用する必要があることを示唆するドキュメントをいくつか読みました。残念ながら、それらについて読めば読むほど、私は混乱していきます。そして、私が最後にやりたいことは、さらに多くのものを壊す修正をリリースすることです:/

私が達成しようとしていることは次のとおりです。

メイン スレッドからタスクを実行ループに追加します。このタスクは、関数 initMyAnalytics() を 1 つだけ呼び出します。ネットワーク データを待って initMyAnalytics() がロックされても、スレッドは引き続き実行されます。initMyAnalytics() が終了すると、静かに終了し、再度呼び出されることはありません (したがって、ループなどは発生しません)。

それを達成する方法はありますか?コード例は大歓迎です ;) よろしく!

4

1 に答える 1

2

その場合、実行ループを使用する必要はありません。実行ループの目的は、特定のスレッドでさまざまなソースからのイベントを順番に進め、何もすることがないときにアイドル状態を維持することです。もちろん、スレッドを切り離し、実行ループを作成し、関数のソースを追加して、関数が終了するまで実行ループを実行することができます。セミトレーラートラックを使用して食料品を家に持ち帰ることができるのと同じです。

ここで必要なのはディスパッチキューです。ディスパッチキューは、タスクを非同期で実行する先入れ先出しデータ構造です。実行ループとは異なり、ディスパッチキューは特定のスレッドに関連付けられていません。作業スレッドは、必要に応じて自動的に作成され、終了します。

実行するタスクは1つしかないため、ディスパッチキューを作成する必要はありません。代わりに、既存のグローバル並行キューを使用します。並行キューは、1つ以上のタスクを同時に実行します。これは、この場合はまったく問題ありません。ただし、実行するタスクが多数あり、各タスクが前のタスクの終了を待機するようにする場合は、シリアルキューを作成する必要があります。

だからあなたがしなければならないのは:

  • 関数をブロックで囲むことにより、関数のタスクを作成します
  • を使用してグローバルキューを取得するdispatch_get_global_queue
  • を使用してタスクをキューに追加しますdispatch_async
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT、0)、^ {
    initMyAnalytics();
});

DISPATCH_QUEUE_PRIORITY_DEFAULTに評価されるマクロです0。優先度の異なるさまざまなグローバルキューを取得できます。2番目のパラメーターは将来の使用のために予約されており、常に。である必要があります0

于 2012-05-29T12:10:58.327 に答える