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。