runloop是属于线程触发的底层基本单元,当一个应用程序app在运行过程当中,之因此不会忽然死掉就是由于runloop一直在循环运行,runloop的内部是由不少的mode组成session
runloop的应用app
切换不一样触发source 好比滑动runloop中能够实现timer图片轮播socket
当主线程中有很重要的事情要处理,不能再开辟一个线程来处理事务的时候 能够在这个主线城中添加一个souce 一个source就是一个selector,在主线程中处理该事务(既不阻塞主线程 也不耽误事件的触发)。oop
[[session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
因主线程有事务要处理,会阻塞主线程外设事件的触发;搜了一下论坛,有一个帖子提供了思路:
“将socket的runloopsource添加到新开的线程的runloop中,并在新线程中显示启动runloop就能够了”spa
个人理解是:建立一个线程,取得它的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中便可。事务