2012-07-17 42 views
3

我不知道如何使用标签参数的方法,如GCDAsyncSocket标签参数

readDataWithTimeout: tag: 
writeData: tag: 

,如果我想使用标签来识别数据包的类型,会发生什么?例如,我说标记== 2意味着数据包是来自客户端的消息,标记== 1意味着数据包是来自服务器的消息... 如果这是好的,我是否需要调用readData:withTag :几次(每个不同的标签一次)?

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

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

回答

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 
    } 
} 
+0

谢谢,我更仔细阅读doc和了解。为了确定数据包的“类型”,我决定将所有数据都包含在NSDictionary中,并使用一个可以识别数据包的密钥。例如,当我读取一个NSData时,我提取密钥(NSString)并根据密钥处理该数据包。这是一种好的做法,还是应该改变我的方法? – rmonjo 2012-07-18 08:14:37

+0

@ user1437126所以你要序列化字典以及数据?听起来对我很好。 – 2012-07-18 15:23:11

+0

是的,这就是我所做的。整个下午都测试了这个解决方案,高效且干净。再次感谢您的回复 – rmonjo 2012-07-18 16:56:24