同時実行タスクに 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 要求を処理するスレッドを除いて、すべてを同期して実行するように指定することです。ただし、これが可能かどうかはわかりません。
シミュレートされた各イベントの後、そのイベントによってトリガーされた作業が完了するまでブロックする方法について何か提案はありますか?