RunLoop(运行循环)-001-初探

Posted stevenhusir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RunLoop(运行循环)-001-初探相关的知识,希望对你有一定的参考价值。

RunLoop :运行循环(保证程序不退出!)(Event Loop)

目的:

1.保住当前线程的生命!!。

2.负责监听事件ios所有事件 触摸,时钟,网络等等!

3.要想保住一条线程的生命,让这条线程有执行不完的任务(死循环)!如果没有事件发送,会让程序进入休眠状态

001-时钟事件

 NSTimer * timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeMethod) userInfo:nil repeats:YES];

    //timer 添加到RunLoop运行循环中

    //NSDefaultRunLoopMode    默认模式!!

    //UITrackingRunLoopMode   UI模式!!

    //NSRunLoopCommonModes    占位模式!! UI&&默认! UI和默认都可以进行,互不影响

    //UI模式优先级最高!!  UI模式只会被触摸事件所触发!!

//    [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];

//    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

002-RunLoop启动和停止(退出)

@property(nonatomic,assign) BOOL finished;

    _finished = NO;

    HKThread * thread = [[HKThread alloc] initWithBlock:^{

        NSTimer * timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeMethod) userInfo:nil repeats:YES];

        [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

        //[[NSRunLoop currentRunLoop] run];//就是一个死循环!! 无法停止UIApplicationMain也是死循环

        NSLog(@"come here");

        while (!self->_finished) {

            [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.0001]];

        }

    }];

    [thread start];//点击屏幕 线程被干掉

 

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

    _finished = YES;

}

 

    HKThread * thread = [[HKThread alloc] initWithBlock:^{

        NSLog(@"%@-----",[NSThread currentThread]);

        while (true) {

            [[NSRunLoop currentRunLoop] run];

        }

    }];

    [thread start];

    

     [self performSelector:@selector(otherMethod) onThread:thread withObject:nil waitUntilDone:NO];

    -(void)otherMethod{

       NSLog(@"OtherMethod --- %@",[NSThread currentThread]);

    }

003-RunLoop source讲解

 Source : 事件源(输入源) 按照函数调用栈,Source分类

 Source0:非Source1 就是 例如用户点击事件

 Source1:系统内核事件或者其他线程间的通信

@property(nonatomic,strong)dispatch_source_t timer;//调度源 用于自动提交事件处理程序块、调度队列以响应外部事件

 //队列

    dispatch_queue_t queue = dispatch_get_global_queue(0,0);

    

    //创建一个定时器!!

    self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

    

    //设置定时器

    dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 1000000000, 0);//纳秒为单位 1000000000 为 1秒

    dispatch_source_set_event_handler(self.timer, ^{

        NSLog(@"-------%@",[NSThread currentThread]);

    });

    

    //启动定时器

     dispatch_resume(self.timer);

 

以上是关于RunLoop(运行循环)-001-初探的主要内容,如果未能解决你的问题,请参考以下文章

RunLoop 之初探

RunLoop相关知识的总结

RunLoop(运行循环)-002-加载大图

iOS 子线程用runloop保活的一个方案

iOS 多线程:『RunLoop』详尽总结

RunLoop