3

現在、CocoaAsyncSocket を使用してアプリを構築しています。TCP サーバーに接続し、データの読み取り/書き込みを行います。

を使用してソケットを作成します

self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

データを受信したら、FMDB を使用してデータベースに保存します。アプリを(ホームボタンを使用して)バックグラウンドに送信してから再開するまで、すべてが正常に機能します。UI がフリーズし、応答しません。デバッガーは、semaphore_wait_trap で待機していることを示します。

4

1 に答える 1

2

メイン キューを delegateQueue パラメーターの引数として使用しないでください。自分で作成したグローバル同時キューまたはシリアル/パラレル キューのいずれかを使用します。

更新: GCDAsyncSocket の実装を調べたところ、デリゲート キューとメソッドが内部キューで発生する実際の読み取り/書き込み操作と非同期で起動されることがわかりました。実際に補完メソッドで行っている)、または少なくとも、あなたが抱えている問題には関係ありません。iOS App Programming Guideに従って、内部ソケットが閉じられていることが原因だと思います。ウィット:

  • ネットワークベースのソケットで接続障害を処理する準備をしてください。アプリが何らかの理由で中断されている間、システムはソケット接続を切断することがあります。ソケットベースのコードが、信号の喪失やネットワークの移行など、他の種類のネットワーク障害に備えている限り、異常な問題が発生することはありません。アプリの再開時にソケットの使用中にエラーが発生した場合は、接続を再確立するだけです。

使用している GCDAsyncSocket クラスには、-autoDisconnectOnClosedReadStream など、これに対処することを目的としていると思われるメソッドがいくつかあります。切断/接続の再確立のケースを処理するためのコードを追加するだけでよいと思います。

于 2012-09-21T05:38:50.830 に答える