美文网首页
Runloop-运行循环

Runloop-运行循环

作者: 江湖闹士 | 来源:发表于2018-04-13 15:38 被阅读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多张图片,滑动卡顿的现象,因为渲染图片也会阻塞线程,可以创建观察者,将任务加到数组中一个一个加载

相关文章

  • Runloop-运行循环

    Runloop的目的何在-保证程序不退出-负责监听事件:触摸、时钟、网络事件-如果没有事件发生,会让程序进入休眠状...

  • RunLoop-运行循环

    runLoop 一个线程一次只能执行一个任务,执行完后线程退出。如果我们需要一个机制,让线程能随时处理事件但并不退...

  • NSTimer

    造成内存泄漏&循环引用的原因 self->timer->self runloop->timer->self 解决 ...

  • runloop-整理中

    runloop-整理中

  • Runloop-事件循环实现机制

    runloop启动后,会首先发送一个通知告诉观察者即将进入runloop;之后runloop会向观察者发送一个即将...

  • 运行循环

    前言 趁辞职还未上班的当,对项目中所使用到的技术做下总结。一来,温故知新,二来,希望也能帮到需要的人。废话不多说,...

  • 运行循环

    iOS运行循环 NSTimer使用 停止计时器 可重用计时器

  • 运行循环

    ​1. 在应用程序启动的时候,系统首先会启动一个主运行循环来给应用程序与用户交互,在这个过程中系统不断重复这个运行...

  • iOS开发-运行循环RunLoop介绍(一)

    1.什么是运行循环RunLoop从字面上理解就是运行循环、死循环、处于一个不断运行的状态。 2.运行循环RunLo...

  • 子线程的运行循环

    Runloop就是运行循环,每个线程内都会有一个运行循环.只有主线程的运行循环是默认开启的,子线程的运行循环默认是...

网友评论

      本文标题:Runloop-运行循环

      本文链接:https://www.haomeiwen.com/subject/fgickftx.html