【问题标题】:AsyncSocket delegate method called incorrectly?AsyncSocket 委托方法调用不正确?
【发布时间】: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;

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

【问题讨论】:

    标签: iphone objective-c sockets asyncsocket


    【解决方案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 还是不行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2012-09-22
    • 2014-11-21
    相关资源
    最近更新 更多