Runloop的目的何在
-保证程序不退出
-负责监听事件:触摸、时钟、网络事件
-如果没有事件发生,会让程序进入休眠状态!
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
//UITrackingRunLoopMode UI模式
//NSDefaultRunLoopMode 默认模式
//NSRunLoopCommonModes 占位模式
// [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
// [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
——如果只使用NSDefaultRunLoopMode,因为UI模式优先级最高,所以当用户触摸的时候触发UI模式,则默认模式下的计时器则不会被响应
——如果用UITrackingRunLoopMode,触摸的时候触发UI模式,则UI模式下的计时器也会被响应,但是当触摸取消的时候,计时器也不会被响应了,因为只有触摸才会触发UI模式
——使用NSRunLoopCommonModes,可以完美解决
让线程有执行不完的任务!!线程就不会释放了!!!
一条线程上面的Runloop模式是不循环的
@interface ViewController ()
@property (nonatomic,assign) BOOL isFinish;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_isFinish = NO;
//子线程
NSThread *thread = [[NSThread alloc] initWithBlock:^{
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
//Runloop---一条线程上面的Runloop模式是不循环的
//最底层的 CFRunloop currentRunloop()第一次获取Runloop的时候,创建Runloop
//[[NSRunLoop currentRunLoop] run];//死循环(这样写,线程干不掉)
if (!_isFinish) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.00001]];
}
NSLog(@"来了!!");
// while(true){
// //从事件队列中取出来事件来处理
// }
}];
[thread start];
}
- (void)timerMethod{
NSLog(@"%@",[NSThread currentThread]);
}
@end
runloop可以用来优化tableView上cell多张图片,滑动卡顿的现象,因为渲染图片也会阻塞线程,可以创建观察者,将任务加到数组中一个一个加载