RunLoop(运行循环)-001-初探
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);