RunLoop:
1:循环跑圈,其内部就是一个做了个do-while循环,在这个循环里不断的处理各种任务(比如source,timer、observer);
2:一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop需要手动启动(调用run)
3:在开发中如何用RunLoop应用场景:
开启一个常驻线程(让一个子线程不进入消亡状态,等待其他线程发过来消息,处理其他事件)
eg:1:在子线程中开启一个定时器
2:在子线程中进行一些长期监控
4:可以控制定时器在特定模式下执行、让某些事件(行为、任务)在特定模式下执行、添加Observer监听RunLoop的状态,比如监听点击事件的处理(在所有的点击事件之前做些事情);
- (void)timer
{
NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
// 定时器只运行在NSDefaultRunLoopMode下,一旦RunLoop进入其他模式,这个定时器就不会工作
// [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
// 定时器只运行在UITrackingRunLoopMode下,一旦RunLoop进入其他模式,这个定时器就不会工作
// [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
// 定时器会跑在标记为common modes的模式下
// 标记为common modes的模式:UITrackingRunLoopMode和NSDefaultRunLoopMode兼容
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}
- (void)timer2
{
// 调用了scheduledTimer返回的定时器,已经自动被添加到当前runLoop中,而且是NSDefaultRunLoopMode
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
// 修改模式
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}
4.常驻线程 (重要)
应用场景:经常在后台进行耗时操作,如:监控联网状态,扫描沙盒等 不希望线程处理完事件就销毁,保持常驻状态
第一种(推荐)
开启
- (void)run
{
//addPort:添加端口(就是source) forMode:设置模式
[[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
//启动RunLoop
[[NSRunLoop currentRunLoop] run];
/*
//另外两种启动方式
[NSDate distantFuture]:遥远的未来 这种写法跟上面的run是一个意思
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
不设置模式
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
*/
}
退出-退出当前线程
[NSThread exit];
第二种(奇葩法)
优点:退出RunLoop比较方便-定义个标记 while(flag){...}
- (void)run
{
while (1) {
[[NSRunLoop currentRunLoop] run];
}
}
原文链接:http://www.jianshu.com/p/cf4915508929
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。