AsyncSocket中tag参数的用处

tag参数是为了在回调方法中匹配发起调用的方法的,不会加在传输数据中。

调用write方法,等待接收消息。收到消息后,会回调didReadData的delegate方法,

delegate方法中的tag和发起read的方法中的tag是对应的。

- (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag;

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;

write和read是一样:writeData方法和对应的delegate方法didWriteDataWithTag的tag是对应的。

- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;

- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag;

需注意的一点是:发送时的tag和接收时的tag是无关的。

以read为例分析:

- (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag

上面的方法会生成一个数据类:AsyncReadPacket,此类中包含tag,并把此对象放入数组theReadQueue中。

在CFStream中的回调方法中,会取theReadQueue最新的一个,在回调方法中取得tag,并将tag传

给回调方法:

- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag;

如此而已。

官方解释:

In addition to this you‘ve probably noticed the tag parameter. The tag you pass during the read/write operation is passed back to you via the delegate method once the read/write operation completes.
It does not get sent over the socket or read from the socket.
It is designed to help simplify the code in your delegate method. For example, your delegate method might look like this:

#define TAG_WELCOME 10

#define TAG_CAPABILITIES 11

#define TAG_MSG 12

...

- (void)socket:(AsyncSocket *)sender didReadData:(NSData *)data withTag:(long)tag

{

if (tag == TAG_WELCOME)

{

// Ignore welcome message

}

else if (tag == TAG_CAPABILITIES)

{

[self processCapabilities:data];

}

else if (tag == TAG_MSG)

{

[self processMessage:data];

}

时间: 2024-10-05 20:55:53

AsyncSocket中tag参数的用处的相关文章

AsyncSocket中tag參数的用处

tag參数是为了在回调方法中匹配发起调用的方法的,不会加在数据传输中. 调用write方法,等待接收消息.收到消息后,会回调didReadData的delegate方法, delegate方法中的tag和发起read的方法中的tag是相应的. - (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag; - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)da

js中(function(){})()的写法用处

http://blog.csdn.net/u010958922/article/details/47007589 js中(function(){})()的写法用处 http://www.cnblogs.com/lunawzh/p/5274474.html http://www.jb51.net/article/29590.htm 从源码中可以看出jQuery.extend和jQuery.fn.extend是同一个方法,但是具体的作用 却不一样.因为在调用jQuery.extend 和jQuery

转载:onCreate()方法中的参数Bundle savedInstanceState 的意义用法

Activity中有一个名称叫onCreate的方法.该方法是在Activity创建时被系统调用,是一个Activity生命周期的开始.可是有一点容易被忽视,就是onCreate方法的参数saveInsanceState.一般的程序开发中,很少用到这个参数.       onCreate方法的完整定义如下:      public void onCreate(Bundle saveInsanceState){                super.onCreate(saveInsanceSt

javascript获取当前url中的参数

javascript获取当前页面url中的参数可以使用location的search方法,获取到的是url中?后面的部分,例如http:localhost:8080/Manager/index.jsp?id=1 使用location的search方法可以获取到字符串?id=1;想要获取?后面的键值对可以使用substring方法对其进行截取,截取后获得id=1;需要获得id的值,可以使用split()方法对其进行拆分,拆分表达式为"=".下面看具体例子: window.onload =

ORA-01084: OCI 调用中的参数无效

执行一个Insert语句,系统抛出来的异常是:ORA-01084:OCI调用中的参数无效. 请注意检查Insert字段中是否有clob字段并传入了这样的""空字符串,如果是的话就是问题所在了. 解决方案: 用DbNull代替""赋值. 代码参照: parameters[0].Value = SqlNull(model.ZB_GUID);  public object SqlNull(object obj)        {            if (obj ==

如何获取url中的参数并传递给iframe中的报表

在使用报表软件时,用户系统左边一般有目录树,点击报表节点就会在右侧网页的iframe中显示出报表,同时点击的时候也会传递一些参数给网页,比如时间和用户信息等.如何使网页中的报表能够获取到传递过来的参数呢?以下用报表软件FineReport简单介绍一些. 具体实现过程 将报表生成页面时,给网页添加onload事件,首先获取url中的参数,然后嫁接到iframe的src上,或者通过获得的参数拼接处完整的报表url赋给iframe的src. <html> <head> <title

js获取url链接中的参数

js获取url链接中的参数:url传递参数这是常识,这里就不多介绍了,既然传递参数就要获取参数的值,下面就介绍一下如何实现此功能.代码如下: function request(paras){ var url="softwhy.com?a=1&b=2"; var paraString=url.substring(url.indexOf("?")+1,url.length).split("&"); var paraObj={} for

【WinRT】获取 Uri 中的参数(QueryString)键值对

在控制台或者其它类型的项目中,可以添加 System.Web,使用以下代码来获取一个 Uri 中的参数 Uri uri = new Uri("http://www.cnblogs.com/h82258652/?gender=male&age=17"); NameValueCollection collection = HttpUtility.ParseQueryString(uri.Query); for (int index = 0; index < collectio

mysqladmin在SuSE linux系统中--sleep参数使用不准确问题

我们都知道,在MySQL中,可以使用mysqladmin命令的extended-status选项来查看MySQL的运行状态,比如获取我们常常关注的几个值: # mysqladmin -uroot -proot ext |grep "Questions\|Queries\|Innodb_rows\|Com_select \|Com_insert \|Com_update \|Com_delete " | Com_delete                               |