物联网设备TCP通信中线程使用的一些技巧(1)

GCDAsyncSocketDelegate

CocoaAsyncSocket是一个非常强大的异步通信库,使用非常简单,物联网的应用都需要使用到这个库。

dispatch_queue_t queue = dispatch_queue_create("netQueue", DISPATCH_QUEUE_SERIAL);
if (!_mySocket) {
	_mySocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:queue];
}

初始化代码很简单就实现,queue是socket的线程,这个线程很重要,整个socket的通信都在这个线程,所以多个socket不能使用相同并发线程,会堵塞。可以在初始化时写NULL,这样GCDAsyncSocketDelegate会自动创建一个自己的socket线程。

dispatch_semaphore_t

物联网设备通信通常是不能太过频繁的,每个通信都需要一个较短时间的间隔,这就需要一个阻塞,通常使用dispatch_semaphore_t来锁住线程

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        dispatch_sync(queue, ^{
            //线程锁需要放在最前面,放在后面锁不住
            dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC);
            dispatch_semaphore_wait(self.sendSignal, time);
           ( do something.....)
            }
 });

以上代码会导致每一次发帧都被锁住0.5s,因为我们与设备的通信都是一问一答,可以在- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag这个delegate中添加一个dispatch_semaphore_signal增加信号量。

dispatch_semaphore_signal每调用一次就会增加一个信号量,如果设备有上报信息会导致信号量数量增加,所以要限制信号量最大为1

限制dispatch_semaphore_t的信号量最大为1:

dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC);
dispatch_semaphore_wait(device.sendSignal, time);
dispatch_semaphore_signal(device.sendSignal);//收到信息增加信号量

如果有信号量就被消耗,没有则在该线程内锁主0.5s。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值