AsyncSocket委托方法调用不正确?

时间:2011-04-21 23:57:23

标签: iphone objective-c sockets asyncsocket

我正在使用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 个答案:

答案 0 :(得分:3)

当套接字完成读取数据时,确实会调用该委托方法。等式中缺少的部分是在接收到的数据完成时告诉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:]委托方法。