AsyncSocket/GCDAsyncSocketis 的哪一部分是关于异步的?

Posted

技术标签:

【中文标题】AsyncSocket/GCDAsyncSocketis 的哪一部分是关于异步的?【英文标题】:What part of AsyncSocket/GCDAsyncSocketis is about being asynchronous? 【发布时间】:2012-02-29 07:13:20 【问题描述】:

GCDAsyncSocket 和 AsyncSocket 标题都声明它们是异步的,看起来都相似。然而,关于套接字的所有内容都是关于处理来自 TCP 数据包的无限长度的单个连续流。起初,我有点困惑,以为 AsyncSocket 通过制作自定义请求和响应数据包并为我异步处理它们做了一些魔术(例如,如果我发出请求 A、B、C,那么来自服务器的响应可能会以不同的顺序,例如 B、C、A)。在深入了解套接字世界之后,我了解到来自服务器(通过套接字读取)的数据是同步的,而不是异步的。这一切都是关于读取一个流,将其切割成数据包并对我的委托类进行回调,如果我发出请求 A、B、C,那么来自服务器的响应将以相同的顺序 A、B、C 出现。 AFAIK,AsyncSocket 使用主运行循环,所以它再次使用主线程,主队列。那么,异步的作用是什么?

【问题讨论】:

【参考方案1】:

从某种意义上说,它是异步的,读取和写入调用立即返回,不会阻塞线程,并允许您稍后通过委托和/或块处理它们的结果。

【讨论】:

【参考方案2】:

UIAdam 是对的。例如,AsyncSocket 通过在另一个线程上处理结果来实现读流回调。这是来自其源代码的代码片段:

static void MyCFReadStreamCallback (CFReadStreamRef stream, CFStreamEventType type, void *pInfo) 
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  AsyncSocket *theSocket = [[(AsyncSocket *)pInfo retain] autorelease];
  [theSocket doCFReadStreamCallback:type forStream:stream];

  [pool drain];
  

【讨论】:

以上是关于AsyncSocket/GCDAsyncSocketis 的哪一部分是关于异步的?的主要内容,如果未能解决你的问题,请参考以下文章