semaphore_wait_trap、GCD 和 CocoaAsyncSocket

Posted

技术标签:

【中文标题】semaphore_wait_trap、GCD 和 CocoaAsyncSocket【英文标题】:semaphore_wait_trap, GCD and CocoaAsyncSocket 【发布时间】:2012-09-19 22:52:39 【问题描述】:

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

我使用创建套接字

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

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

【问题讨论】:

你没有使用任何后台模式或任务,是吗? 不,不使用任何后台任务。我什至在进入后台时关闭了套接字 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于semaphore_wait_trap、GCD 和 CocoaAsyncSocket的主要内容,如果未能解决你的问题,请参考以下文章

isRegisteredForRemoteNotifications使用semaphore_wait_trap锁定UI

数论----gcd和lcm

最大公约数gcd和最小公倍数lcm

数论——gcd&&lcm

gcd和ex_gcd

gcd和NSOperationQueue区别