首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >semaphore_wait_trap、GCD和CocoaAsyncSocket

semaphore_wait_trap、GCD和CocoaAsyncSocket
EN

Stack Overflow用户
提问于 2012-09-20 06:52:39
回答 1查看 1.3K关注 0票数 3

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

我使用以下命令创建套接字

代码语言:javascript
复制
self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-21 13:38:51

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

更新:我刚刚查看了GCDAsyncSocket的实现,现在意识到委托队列和方法与实际的读/写操作是异步触发的,这些操作发生在内部队列上,所以我的建议要么是无关紧要的(取决于你在完成方法中实际做了什么),要么是至少与你所遇到的问题无关。我认为发生的情况是内部套接字正在关闭,根据iOS App Programming Guide。也就是说:

  • 准备好处理基于网络的套接字中的连接故障。由于各种原因,应用程序挂起时,系统可能会断开套接字连接。只要您的基于套接字的代码为其他类型的网络故障做好了准备,这应该不会导致任何不寻常的问题。当应用程序恢复时,如果在使用套接字时遇到故障,只需重新建立连接。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12503998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档