1

私はiOSでVoIPハンドセットアプリケーションを構築しています(PJSIPライブラリを使用)。PJSIPでは、スレッドセーフの目的で、それにアクセスして構成を管理するスレッドを登録する必要があります。つまり、そのライブラリへの呼び出しの処理または管理はGCDで処理できず、メインスレッド上にあるか(問題がある場合はブロックされ、UIが描画されないため、ひどい解決策)、または独自の専用スレッドを作成する必要があります。 。

アプリデリゲートで独自の専用スレッドとrunloopを作成し、それにいくつかのセレクターを実行しましたが、面倒です。現在のセッションへのすべての呼び出しを、起動時に作成するシングルトンオブジェクトにカプセル化し、それらのすべての呼び出しを独自のスレッドで発生させたいと考えています。

Appleのドキュメントは少しまばらなので、このPJSIPインスタンスに登録されたスレッドを管理するためのよりインテリジェントな方法があるかどうかを調べようとしています。地獄、私も考えもしなかったことがあるかもしれません。

技術的な質問だとは思いますが、人々がどのようなアイデアを思いつくのか興味があります。

NSThreadの上に、その特定のスレッドでブロックを実行できるカテゴリをすでに作成しましたが、これは醜い醜いハックです。

4

1 に答える 1

2

これに対するいくつかの解決策を考えることができます。メソッドの数が限られている場合は、シングルトン インスタンスを取得し、シングル スレッドでメソッドを実行する各メソッドの静的ラッパーを作成できます。呼び出しスレッドをブロックするかどうかは、メソッドごとに選択できます。

頭に浮かんだもう 1 つのオプションは、よりエレガントで拡張性に優れているため、イベント システムを使用することです。メソッドごとにイベントを定義できます。関数がメソッドを実行したい場合は、イベントをトリガーします。イベントからデータを返す必要がある場合は、メソッドが完了したことを示すイベントに呼び出し元を登録させることができます。

頭に浮かぶ最終的な解決策は、 forwardInvocation: メソッドを使用して任意のメッセージに応答するプロキシ オブジェクトを作成し、単一のスレッドで実際のシングルトン インスタンスのセレクターを呼び出すことです。(詳細については、Apple のドキュメントを参照してください: Forwarding )。これは最も複雑ですが、最終的にはおそらく最もエレガントです。これにより、余分なラッピングを行うことなく、将来的に新しい機能を追加することができます。

于 2012-04-12T04:17:50.103 に答える