Runloop-运行循环

2018-04-13  本文已影响12人  江湖闹士

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];
Runloop.png

——如果只使用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多张图片,滑动卡顿的现象,因为渲染图片也会阻塞线程,可以创建观察者,将任务加到数组中一个一个加载

上一篇 下一篇

猜你喜欢

热点阅读