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中便可。事務