为什么说菜鸟,因为菜鸟就是菜鸟,没有通讯基础,非科班出身,没有基本的网络知识.
当然后来发现有网络知识对于解决我这个bug,也是'然并卵'.
写在开头,对于自己的反省,我一直很想知道优秀的程序员是怎样写代码的,为什么我就是菜鸟?
这个bug,赤裸裸的扇了我一个巴掌,然而我还没有要改的意思.我总结出来这样一句话,"犯贱的人,绝对不是优秀的程序员."
下面整理下,虽然很多代码,和最后解决bug问题,没有多大关系,就当总结一下咯.
1.首先介绍下在队列中添加一个线程去doping.也就是做心跳包了.(这个不是我写的,有人说用定时器写会简单些)
NSInvocationOperation *pingop =
[[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(doPing)
object:nil];
[gQueue_ addOperation:pingop];
[pingop release];
2.介绍下具体的doping 方法
- (void)doPing {
float interval = [Settings instance].appInfo.pingInterval;
const float wait = 0.5f;
while (connected_) {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
@try {
float past = 0.0;
while (connected_ && past < interval) {
[NSThread sleepForTimeInterval:wait];
past += wait;
}
if (!connected_) {
break;
}
dispatch_barrier_async(_serialQueue, ^{
if ([self sendPing] != kReturnNormal) {
//设置断开连接,统一交到loop去处理
connected_ = NO;
}
});
} @finally {
[pool release];
}
}
}
3.开始说关键的地方了.上面这个代码
dispatch_barrier_async(_serialQueue, ^{
if ([self sendPing] != kReturnNormal) {
//设置断开连接,统一交到loop去处理
connected_ = NO;
}
});
本身代码就属于次线程,次线程中又添加了一个串行化队列.为什么要用串行化队列呢?
1.什么是串行化队列?
dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
学习地址:http://www.cnblogs.com/stoic/archive/2012/09/25/2785184.html
因为后面防止发送数据,使用同一个方法,防止数据冲突.
这样的代码的前提
@property (nonatomic,strong)dispatch_queue_t serialQueue;//串行化队列
我之前是
@interface CommClient() {
dispatch_queue_t _serialQueue;
}
_serialQueue的创建.
_serialQueue = dispatch_queue_create("com.navensoft.eric", NULL);
我这个队列的属性的设置Strong,还是在interface 中添加,直接导致我的心跳包后面timeout.因为队列都丢失了.