[[session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
因主线程有事务要处理,会阻塞主线程外设事件的触发;搜了一下论坛,有一个帖子提供了思路:
“将socket的runloopsource添加到新开的线程的runloop中,并在新线程中显示启动runloop就可以了”
我的理解是:创建一个线程,取得它的runloop,然后用类似上面的代码将其加入,这样就不会阻塞接收数据事件的回调了。
即[NSThread detachNewThreadSelector: @select(act:) toTarget: self withObject:nil];
[[session inputStream] scheduleInRunLoop:threadRunLoop
forMode:NSDefaultRunLoopMode];
-(void)act:(id)
{
threadRunLoop = [NSRunloop currentRunloop];
if (!threadShouldExit)
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:limitDate];
}
}
然后将stream加入到子线程的runloop中即可。