0

同時実行タスクに NSThreads を使用する iOS アプリケーションがあります。並行処理に Grand Central Dispatch (GCD) を使用するように移行しようとしています。

問題は、アプリが特定の時間以降に作成されたスレッドの数に関する情報を必要とすることです。そして、その特定の時間以降に生成され、現在実行中のスレッドの数。

現時点では、これは のメソッド-mainでメソッド スウィズリングを行うカテゴリを作成することによって行われますNSThread。新しい swizzled メソッドでは、実行中のスレッドの総数を単純にインクリメントし、新しい swizzled-mainメソッドが戻る前に同じ変数をデクリメントします。

問題は、GCD を使用するdispatch_asyncと が作成されないNSThreadため、カテゴリ アプローチが機能しないことです。GCDを使用して同時実行を処理しながら、どうすれば同じことを達成できますか?

私が検出したいのは、新しいブロックが GCD に追加されたときと、そのブロックが実行されたときです。

同じことを達成する方法についての提案は大歓迎です。

編集

これを手伝ってくれた@ipmccと@RyanRに感謝します。:) 背景と私が達成しようとしていることについて、もう少し話す必要があると思います。

私が実際に試みているのは、iOS テスト フレームワークFrankを拡張することです。Frank特定のアプリ内に小さな Web サーバーを埋め込みます。これにより、HTTP 要求を iOS アプリケーションに送信できるようになり、それによって、例としてスワイプまたはタップ ジェスチャなどのイベントをシミュレートできます。

リクエストに応じて戻る前に、特定のシミュレートされたイベントによってトリガーされたすべての作業が終了するまで待機できるように拡張したいと思います。

ただし、受信したイベントによってトリガーされた作業を正確に検出するのは難しいことがわかりました。そして、それが、スレッドカウンターをリセットし、イベントがシミュレートされた後に作成されたすべてのスレッドに対してこのカウンターをインクリメントし、スレッドが終了したときにそれをデクリメントするというソリューションにたどり着いた方法です。そして、スレッド数が再びゼロになるまでブロックします。このアプローチも完璧ではなく、GCP では機能しないことはわかっています。

それを達成する他の方法はありますか?私が考えたもう 1 つの解決策は、HTTP 要求を処理するスレッドを除いて、すべてを同期して実行するように指定することです。ただし、これが可能かどうかはわかりません。

シミュレートされた各イベントの後、そのイベントによってトリガーされた作業が完了するまでブロックする方法について何か提案はありますか?

4

2 に答える 2

2

ディスパッチ イントロスペクション関数 (introspection.h、メソッドはすべて で始まりdispatch_introspectionます) にフックできますが、デバッグ専用であるはずのライブラリとリンクする必要があります。それをリリースビルドに含めることはできないと思います。最善の策は、GCD を独自のオブジェクトにカプセル化することです。そのため、すべてのコードはそのオブジェクトを介して実行するブロックを送信し、関心のあるものを追跡した後に GCD に送信します。ただし、スレッドの消費を追跡することはできません。 、GCD は意図的にそれを抽象化し、スレッドを再利用するためです。

于 2013-10-18T14:17:59.857 に答える