GCDAsyncSocket标记参数

时间:2012-07-17 14:28:02

标签: objective-c gcdasyncsocket

我想知道如何在

等方法中使用tag参数
readDataWithTimeout: tag:
writeData: tag:

如果我想使用标签识别数据包的类型会怎样?例如,我说tag == 2表示数据包是来自客户端的消息,tag == 1表示数据包是来自服务器的消息... 如果这样可以,我需要多次调用readData:withTag:(每个不同的标签一次)?

[readDataWithTimeout:-1 tag:1];
[readDataWithTimeout:-1 tag:2];

有没有办法说:“读取每个数据而不关心标签”,然后在didReadData:withTag:方法中根据标签处理数据?

1 个答案:

答案 0 :(得分:6)

我认为你对标签概念略有误解。读取操作不是说“读取已标记为2的数据”。他们 说“从线上读取下一个数据,并将其标记为2以供将来参考。”

标签永远不会通过网络发送 - 服务器没有标记数据并将其发送到客户端进行读取。它是一个完全可选的概念,仅用于区分本地操作。换句话说,正在读取的数据没有标签。标签是您为读取操作分配的内容,因此您可以在完成后识别它。

例如,假设您正在将数据读取为一系列标头和有效负载。您可以使用标记来区分读取的有效读取头:

const NSInteger kHeaderTag = 1;
const NSInteger kPayloadTag = 2;

// Assume you know to expect a header, so tag the read operation as such.
[self readDataWithTimeout:-1 tag:kHeaderTag];

// Next assume you know to expect a payload, so tag the read operation as such.
[self readDataWithTimeout:-1 tag:kPayloadTag];

然后你可以稍后识别它......

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    if (tag == kHeaderTag)
    {
        // Handle header
    }
    else if (tag == kPayloadTag)
    {
        // Handle payload
    }
}