一、RunLoop定义
当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程。RunLoop就是控制线程生命周期并接受事件进行处理的机制。
RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿于整个iOS系统。
二、RunLoop目的
通过RunLoop机制实现省电,流畅,响应速度快,用户体验好
三、RunLoop特性
1.主线程的RunLoop在应用启动时就会自动创建,其他线程需要在该线程下自己启动,不能自己创建RunLoop
四、RunLoopModes
1.NSDefaultRunLoopMode:默认模式
2.NSConnectionReplyMode:用来监听网络请求NSConnection的事件
3.NSModalPanelRunLoopMode:OS X的Modal面板事件
4.UITrackingRunLoopMode:拖动事件
5.NSRunLoopCommonModes:是一个模式集合
五、RunLoop应用
(1)在主线程启动一个定时器Timer,然后拖动UItableview或UIScrollView,计时器不执行。只是因为为了更好的用户体验,在主线程中event tracking模式优先级最高。在用户拖动控件时,主线程的RunLoop是运行在evevt tracking mode下,而创建的Timer是默认关联的Default Mode,因此系统不会立即执行Default Mode下接收的事件。解决方法:
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeAction) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
// [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
(2)维护线程的生命周期,让线程不自动退出,isFinished为YES时退出
<span style="font-size:14px;">[[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
while (!self.isCancelled && !self.isFinished) {
@autoreleasepool {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
}
}</span>
(3)AFNetworking中创建一个常驻线程
+ (void)networkRequestThreadEntryPoint:(id)__unused object {
@autoreleasepool {
[[NSThread currentThread] setName:@"AFNetworking"];
//这里主要是监听某个port,目的是让这个thread不会回收,即常驻线程
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
[runLoop run];
}
}
+ (NSThread *)networkRequestThread {
static NSThread *_networkRequestThread = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil];
[_networkRequestThread start];
});
return _networkRequestThread;
}