首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCDAsyncSocket标签参数

GCDAsyncSocket标签参数
EN

Stack Overflow用户
提问于 2012-07-17 22:28:02
回答 1查看 1.6K关注 0票数 3

我想知道如何在方法中使用tag参数,比如

代码语言:javascript
复制
readDataWithTimeout: tag:
writeData: tag:

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

代码语言:javascript
复制
[readDataWithTimeout:-1 tag:1];
[readDataWithTimeout:-1 tag:2];

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-17 23:55:35

我认为你稍微误解了标签的概念。读取操作不会显示“已标记为2的读取数据”。他们说:“从线路上读取下一个数据,并将其标记为2以供将来参考。”

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

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

代码语言:javascript
复制
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];

然后你可以在以后识别它..。

代码语言:javascript
复制
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    if (tag == kHeaderTag)
    {
        // Handle header
    }
    else if (tag == kPayloadTag)
    {
        // Handle payload
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11524710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档