AsyncSocket 委托方法调用不正确?

Posted

技术标签:

【中文标题】AsyncSocket 委托方法调用不正确?【英文标题】:AsyncSocket delegate method called incorrectly? 【发布时间】:2011-04-21 23:57:23 【问题描述】:

我正在使用 AsyncSocket 类通过本地网络将相当大的图像从 iPhone 传输到 Mac。在标头中,didReadData 委托方法声明如下:

/**
 * Called when a socket has completed reading the requested data into memory.
 * Not called if there is an error.
**/
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;

它表示当套接字完成读取数据时将调用此方法。但是这个方法被调用了很多次,每次数据长度都会增加。我怎么知道下载何时完成?我的意思是在前几个字节中发送数据的长度吗?

【问题讨论】:

【参考方案1】:

当套接字完成读取数据时,确实会调用该委托方法。等式中缺少的部分是告诉AsyncSocket何时接收到的数据是完整的。它不了解您尝试接收的数据,您必须告诉它 - 正如您在最后一个问题中提到的那样。

这就是AsyncSocket 真正闪耀的地方。您确实可以发送以它的长度为前缀的图像,并让类发挥它的魔力。您的代码如下所示。

[sock readDataToData:[AsyncSocket CRLFData] withTimeout:0 tag:kLengthTag];

在您的委托方法中:

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 
    if (tag == kLengthTag) 
        NSUInteger length = /* read length out of nsdata */;
        [sock readDataToLength:length withTimeout:0 tag:kImageTag];
     else if (tag == kImageTag) 
        /* hurray, you have your image! */
    

当然,如果您要传输相当大的图像,您可能需要跟踪您的进度。为此,有-[AsyncSocket progressOfReadReturningTag:bytesDone:total:] 实例方法。还有-[id<AsyncSocketDelegate> onSocket:didReadPartialDataOfLength:tag:] 委托方法。

【讨论】:

如果它有效,那就太好了,因为实现了这一点,didReadData 只是有时会被称为长度,而不会被称为图像。 出于某种疯狂的原因,长度必须是 int,而不是 NSUInteger,即使我在其他任何地方都使用过 NSUInteger,因为那是 NSData 使用的。 也许您可以与我们分享一个代码示例。使用NSUIntegerlongint 的类型定义,取决于您的平台)是极不可能的问题;这更有可能是您在其他地方解析的问题。 它不起作用,所以我尝试将长度设置为 5。如果传输的数据会逐渐变大,直到达到实际长度,并且一切正常。看到将长度直接放在代码中是一个 int 我将类型更改为 int 并且它起作用了。改回 NSUInteger 还是不行。

以上是关于AsyncSocket 委托方法调用不正确?的主要内容,如果未能解决你的问题,请参考以下文章

ios asyncsocket 无法调用 readdata 方法

CLLocationManager 如何根据 iOS 版本调用正确的委托方法

UICollectionView 委托方法没有被正确调用

UIPageViewController 不调用委托方法(Swift 5)

AsyncSocket中tag參数的用处

.reloadData() 没有调用 NSTableView 委托方法