Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone AsyncSocket委托方法调用不正确?_Iphone_Objective C_Sockets_Asyncsocket - Fatal编程技术网

Iphone AsyncSocket委托方法调用不正确?

Iphone AsyncSocket委托方法调用不正确?,iphone,objective-c,sockets,asyncsocket,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

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

它表示,当套接字读取数据时,将调用此方法。然而,这个方法被调用了很多次,每次数据长度都在增加。我怎么知道下载什么时候完成?我是否打算在前几个字节发送数据长度?

当套接字完成数据读取时,确实会调用委托方法。方程式中缺少的部分是告诉
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 ProgressOfRestoringTag:bytesDone:total:
实例方法。还有
-[id onSocket:didReadPartialDataOfLength:tag:][/code>委托方法。

当套接字完成数据读取时,确实会调用该委托方法。方程式中缺少的部分是告诉
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 ProgressOfRestoringTag:bytesDone:total:
实例方法。还有
-[id onSocket:didReadPartialDataOfLength:tag:][/code>委托方法。

如果它能工作,那就太好了,因为实现了这一点,
didReadData
有时只会调用长度,而不会调用图像。出于某些疯狂的原因,长度必须是int,而不是整数,尽管我在其他地方都使用了NSUTEGER,因为NSData就是这样使用的。也许你可以和我们分享一个代码示例。使用
NSUInteger
(根据您的平台,
long
int
的typedef)是问题的可能性非常小;这很可能是你在其他地方解析的问题。它不起作用,所以我尝试将长度设置为5。并且逐渐变大,直到我达到了实际长度,如果数据被传输,那么一切都很完美。因为在代码中直接输入长度是一个int,所以我将类型改为int,这样就行了。将其更改回NSUInteger,但它不起作用。如果它起作用,那就太好了,因为实现了此功能,
didReadData
只是有时会调用长度,而不会调用图像。出于某些疯狂的原因,长度必须是int,而不是NSUInteger,尽管我在其他地方都使用了NSUTEGER,因为NSData就是这样使用的。也许你可以和我们分享一个代码示例。使用
NSUInteger
(根据您的平台,
long
int
的typedef)是问题的可能性非常小;这很可能是你在其他地方解析的问题。它不起作用,所以我尝试将长度设置为5。并且逐渐变大,直到我达到了实际长度,如果数据被传输,那么一切都很完美。因为在代码中直接输入长度是一个int,所以我将类型改为int,这样就行了。将其更改回整数,但它不起作用。