我目前正在使用CocoaAsyncSocket构建一个App。我连接到TCP服务器并读/写一些数据。
我使用
创建套接字self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
收到数据后,我使用FMDB将其保存到数据库中。一切正常,直到我将应用程序发送到后台(使用Homebutton),然后恢复它。调试器显示,UI正在冻结且没有响应,它正在semaphore_wait_trap中等待。
答案 0 :(得分:2)
不要将主队列用作delegateQueue参数的参数。使用您自己创建的全局并发队列之一或串行/并行队列。
更新:我刚看了GCDAsyncSocket的实现,现在意识到委托队列和方法被异步发送到实际的读/写操作,这发生在内部队列上,所以我的建议要么无关紧要(取决于什么你实际上是在完成方法中做的,或者至少与你所遇到的问题无关。根据{{3}},我认为发生的事情是内部套接字正在关闭。即:
您正在使用的GCDAsyncSocket类有一些似乎旨在处理此问题的方法,例如-autoDisconnectOnClosedReadStream,我认为您只需要添加一些代码来处理断开/连接重建案例。< / p>