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 回答