RunLoop是經過內部維護的事件循環來對事件/消息進行管理的一個對象數據結構
NSRunLoop是CFRunLoop的封裝,提供了面向對象的API多線程
基於事件的定時器oop
觀測時間點ui
NSRunLoopCommonModesspa
滑動TableView時RunLoop發生Mode切換,由kCFRunLoopDefaultMode切換爲UITrackingRunLoopMode,要確保Timer事件的正常運行,須要同時添加到兩種mode下線程
void CFRunLoopAddTimer(runLoop, timer. commonMode) 複製代碼
線程與RunLoop一一對應; 本身建立的線程默認是沒有RunLoop的3d
+ (NSThread *)_networkThread
{
static NSThread *thread = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
thread = [[NSThread alloc] initWithTarget:self, selector:@selctor(_networkThreadMain:) object:nil];
if ([thread respondsToSelector:@selector(setQualityService:)]) {
thread.qualityOfService = NSQualityServiceBackground;
}
[thread start];
})
}
+ (void)_networkThreadMain:(id)object
{
@autoreleasePool {
[[NSThread currentThread] setName:@"threadMain"];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMatchPort port] forMode:NSDefaultRunLoopMode];
[runLoop run];
}
}
複製代碼