RunLoop笔记
runloop的理解:
1.runloop表面意思就是:运行循环
2.基本作用:
1。保证程序的持续运行(如果没有runloop,程序刚运行就结束)
2. runloop用于处理一些app事件(比如定时器,手势,@selector方法等)
3. runloop可以节省CPU资源,提高程序性
3.runloop在主线程中由程序自动创建,在子线程中就需要手动创建
4.每个线程对应唯一的runloop(runloop创建并不是alloc init,而是currentRunLoop,
这是懒加载形式,保证即使多次创建loop,最终返回的都是同一个loop对象),
主线程对应的runloop:[NSRunLoop mainRunLoop]
子线程的runloop:[NSRunLoop currentRunLoop]
5.runloop生命周期:从第一次获取时创建到该线程结束时摧毁
6.runloop的使用场景:
比如定时器:1.在主线程创建定时器,当界面滑动的时候,会切换到UITrackingRunLoopMode模式,定时器就会暂停,等其任务结束定时器才会恢复,解决方式就是改变loop模式
系统默认是NSDefaultRunLoopMode,将其改成NSRunLoopCommonModes
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(time) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
2.在子线程创建定时器,只要保证创建一个runloop,并且在运行,那么无论是NSDefaultRunLoopMode模式还是NSRunLoopCommonModes模式都不影响结果
比如@selector方法使用:1.在主线程调用,没毛病
2.在子线程调用,xxx方法并不会调用
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self performSelector:@selector(xxx) onThread:[NSThread currentThread] withObject:nil waitUntilDone:NO];
});
- (void)xxx {
}
原因:子线程没有创建runloop,而主线程程序自动创建
解决: 创建一个runloop并且运行[[NSRunLoop currentRunLoop] run];