p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC” }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC”; color: #ff40ff }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC”; color: #919191 }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC”; color: #3e1e81; background-color: #ffffff }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC”; color: #008400; background-color: #ffffff }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC”; color: #aa7942; background-color: #ffffff }
p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC”; color: #0433ff; background-color: #ffffff }
p.p8 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC”; color: #ba2da2; background-color: #ffffff }
p.p9 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC”; color: #4f8187; background-color: #ffffff }
p.p10 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC”; color: #000000; background-color: #ffffff }
p.p11 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC”; color: #d12f1b; background-color: #ffffff }
p.p12 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC”; background-color: #ffffff; min-height: 20.0px }
p.p13 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC”; color: #000000; background-color: #ffffff; min-height: 20.0px }
p.p14 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC”; color: #aa7942 }
p.p15 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px “Yuanti SC”; color: #78492a; background-color: #ffffff }
span.s1 { color: #0433ff }
span.s2 { color: #ff2600 }
span.s3 { color: #000000 }
span.s4 { color: #aa7942 }
span.s5 { background-color: #ffffff }
span.s6 { color: #008400; background-color: #ffffff }
span.s7 { color: #ff2600; background-color: #ffffff }
span.s8 { color: #703daa }
span.s9 { color: #272ad8 }
span.s10 { color: #ba2da2 }
span.s11 { color: #008400 }
span.s12 { color: #4f8187 }
span.s13 { color: #3e1e81 }
span.s14 { color: #919191 }
span.s15 { color: #d12f1b }
span.s16 { color: #78492a }

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);

 

版权声明:本文为StevenHuSir原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/StevenHuSir/p/RunLoop_Brief.html