7-4 RunLoop 与多线程

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常驻线程

你可能感兴趣的:(7-4 RunLoop 与多线程)