我正在使用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;
它表示当套接字完成读取数据时,将调用此方法。但是这种方法被调用很多次,每次数据长度都在增加。我是怎么知道下载完成的?我的意思是在前几个字节中发送数据的长度吗?
答案 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:]
委托方法。