3

現在、NSInputStreamを開くと(たとえば)、完全に開いたことを示すイベントを取得するように設定できます。しかし、失敗した場合、イベントはまったく発生しません。オープニングが完了しなかったとは言われません。開こうとしているときにポーリングできますが、スレッドを長時間拘束する必要があります。

私がやりたいのは、ストリームが開くか、開かないかを待つ効率的なコードを書くことです。NSStreamらを使用するそのような方法はありますか?

また、一定期間待つことができるイベントを作ることも考えました。接続が成功した場合、イベントは信号を送り、待機状態から抜け出します。タイムアウトが発生した場合は、ステータスをテストして失敗したかどうかを確認するか、再び待機状態に戻ることができます。しかしもちろん、これは計画Bであり、雄弁で効率的ではありません。そして、CocoaTouchのドキュメントを調べても、タイムアウトで待機できるようなシグナルを作成する方法がまったくわかりません。

どんな助けでもいただければ幸いです。

4

1 に答える 1

7

NSStreamが開かない場合に発生するイベントがありますNSStreamEventErrorOccurred。おそらく、発生している問題は、TCP/IPタイムアウトが非常に長くなる可能性があることです。したがって、ホストへの接続が失敗する場合は、このイベントが発生するまでに30秒かかることがあります。

NSTimerストリームを少し短い間隔で開くと同時に開始することもできますが、その間隔がどうあるべきかという問題に遭遇しますか?

TCP / IPタイムアウトが発生しない限り、ユーザーの手に接続をキャンセルするオプションを残す方がよい場合がよくあります。

私が多くのプロジェクトで行ったことは、約1秒後にアクティビティインジケーターとキャンセルボタンを備えたカスタムモーダルビューが表示されます。ローカルネットワーク上の多くの接続はこの時間までに完了し、ユーザーはポップアップに煩わされることはありません。低速の接続の場合、これにより、ユーザーは待機する時間を決定できます。しばらくしてからモーダルビューのメッセージを更新して、接続に通常よりも時間がかかっていることを伝えて、プログラムが待機していることを認識できるようにすることもできます。

于 2012-07-31T22:09:51.713 に答える