0

我正在使用 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;

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

4

1 回答 1

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:]委托方法。

于 2011-04-22T00:57:23.230 回答