1.RunLoop与线程的联系:
RunLoop与线程是一一对应的关系
线程创建的时候并没有RunLoop对象
RunLoop会在第一次获取它的时候创建,调用[NSRunLoop currentRunLoop]获取RunLoop
RunLoop保存在一个全局的Dictionary中,key是线程,value是RunLoop
主线程在启动的时候,会自动获取RunLoop对象
子线程默认没有开启RunLoop
RunLoop会在线程结束时候销毁
2.如何保证线程的常驻
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSTimer * timer = [NSTimer timerWithTimeInterval:1.f repeats:YES block:^(NSTimer * _Nonnull timer) {
static int count = 0;
[NSThread sleepForTimeInterval:1];
//休息一秒钟,模拟耗时操作
NSLog(@"%s - %d",__func__,count++);
}];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
//子线程需要手动开启Runloop
[[NSRunLoop currentRunLoop] run];
});
[NSRunLoop currentRunLoop] 如果没有的话系统会给我们自动创建子线程的NSRunLoop
3.更新数据时如何保证不打断用户的滑动操作
当用户滑动的时候,当前的RunLoop运行在trackingMode模式下,我们可以把子线程抛会主线程更新UI这段逻辑封装到主线程的defaultMode下
这样抛回来的任务当用户滑动的时候,就不会执行打断用户滑动;当滑动结束后,主线程切回到defaultMode就可以执行更新UI数据。
[self performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO modes:@[NSDefaultRunLoopMode]];
Runloop常驻线程
网友评论