我认为您对标签概念略有误解。读取操作并不是说“读取已标记为 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
}
}