semaphore_wait_trap,GCD和CocoaAsyncSocket

时间:2012-09-19 22:52:39

标签: ios multithreading grand-central-dispatch fmdb cocoaasyncsocket

我目前正在使用CocoaAsyncSocket构建一个App。我连接到TCP服务器并读/写一些数据。

我使用

创建套接字
self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

收到数据后,我使用FMDB将其保存到数据库中。一切正常,直到我将应用程序发送到后台(使用Homebutton),然后恢复它。调试器显示,UI正在冻结且没有响应,它正在semaphore_wait_trap中等待。

1 个答案:

答案 0 :(得分:2)

不要将主队列用作delegateQueue参数的参数。使用您自己创建的全局并发队列之一或串行/并行队列。

更新:我刚看了GCDAsyncSocket的实现,现在意识到委托队列和方法被异步发送到实际的读/写操作,这发生在内部队列上,所以我的建议要么无关紧要(取决于什么你实际上是在完成方法中做的,或者至少与你所遇到的问题无关。根据{{​​3}},我认为发生的事情是内部套接字正在关闭。即:

  • 准备好处理基于网络的连接失败 插座。系统可能会在您的应用程序中拆除套接字连接 因任何原因被暂停。只要你的套接字为基础 代码是为其他类型的网络故障准备的,例如丢失 信号或网络转换,这不应该导致任何异常 问题。当您的应用恢复时,如果遇到失败 使用套接字,只需重新建立连接。

您正在使用的GCDAsyncSocket类有一些似乎旨在处理此问题的方法,例如-autoDisconnectOnClosedReadStream,我认为您只需要添加一些代码来处理断开/连接重建案例。< / p>